.. | .. |
---|
87 | 87 | |
---|
88 | 88 | static void rkisp_config_cmsk(struct rkisp_device *dev); |
---|
89 | 89 | |
---|
90 | | -struct backup_reg { |
---|
91 | | - const u32 base; |
---|
92 | | - const u32 shd; |
---|
93 | | - u32 val; |
---|
94 | | -}; |
---|
95 | | - |
---|
96 | 90 | static inline struct rkisp_device *sd_to_isp_dev(struct v4l2_subdev *sd) |
---|
97 | 91 | { |
---|
98 | 92 | return container_of(sd->v4l2_dev, struct rkisp_device, v4l2_dev); |
---|
.. | .. |
---|
730 | 724 | params_vdev->rdbk_times = dma2frm + 1; |
---|
731 | 725 | |
---|
732 | 726 | run_next: |
---|
733 | | - rkisp_params_cfgsram(params_vdev); |
---|
| 727 | + rkisp_params_cfgsram(params_vdev, true); |
---|
734 | 728 | stats_vdev->rdbk_drop = false; |
---|
735 | 729 | if (dev->is_frame_double) { |
---|
736 | 730 | is_upd = true; |
---|
.. | .. |
---|
753 | 747 | writel(val, hw->base_addr + ISP3X_DRC_EXPLRATIO); |
---|
754 | 748 | if (hw->unite == ISP_UNITE_TWO) |
---|
755 | 749 | writel(val, hw->base_next_addr + ISP3X_DRC_EXPLRATIO); |
---|
| 750 | + val = rkisp_read_reg_cache(dev, ISP3X_YNR_GLOBAL_CTRL); |
---|
| 751 | + writel(val, hw->base_addr + ISP3X_YNR_GLOBAL_CTRL); |
---|
| 752 | + if (hw->unite == ISP_UNITE_TWO) |
---|
| 753 | + writel(val, hw->base_next_addr + ISP3X_YNR_GLOBAL_CTRL); |
---|
| 754 | + if (dev->isp_ver == ISP_V21 || dev->isp_ver == ISP_V30) { |
---|
| 755 | + val = rkisp_read_reg_cache(dev, ISP3X_CNR_CTRL); |
---|
| 756 | + writel(val, hw->base_addr + ISP3X_CNR_CTRL); |
---|
| 757 | + if (hw->unite == ISP_UNITE_TWO) |
---|
| 758 | + writel(val, hw->base_next_addr + ISP3X_CNR_CTRL); |
---|
| 759 | + } |
---|
756 | 760 | } else { |
---|
757 | 761 | /* the frame first running to off mi to save bandwidth */ |
---|
758 | 762 | rkisp_multi_overflow_hdl(dev, false); |
---|
.. | .. |
---|
869 | 873 | struct rkisp_buffer *buf; |
---|
870 | 874 | u32 i, val; |
---|
871 | 875 | |
---|
| 876 | + if (!dev->is_rtt_first) |
---|
| 877 | + return; |
---|
| 878 | + |
---|
872 | 879 | for (i = RKISP_STREAM_RAWRD0; i < RKISP_MAX_DMARX_STREAM; i++) { |
---|
873 | 880 | stream = &dev->dmarx_dev.stream[i]; |
---|
874 | 881 | if (!stream->ops) |
---|
.. | .. |
---|
933 | 940 | goto end; |
---|
934 | 941 | if (!IS_HDR_RDBK(dev->rd_mode)) |
---|
935 | 942 | goto end; |
---|
| 943 | + if (dev->is_suspend) { |
---|
| 944 | + if (dev->suspend_sync) |
---|
| 945 | + complete(&dev->pm_cmpl); |
---|
| 946 | + goto end; |
---|
| 947 | + } |
---|
936 | 948 | |
---|
937 | 949 | for (i = 0; i < hw->dev_num; i++) { |
---|
938 | 950 | isp = hw->isp[i]; |
---|
939 | 951 | if (!isp || |
---|
940 | | - (isp && !(isp->isp_state & ISP_START))) |
---|
| 952 | + (isp && (!(isp->isp_state & ISP_START) || isp->is_suspend))) |
---|
941 | 953 | continue; |
---|
942 | 954 | rkisp_rdbk_trigger_event(isp, T_CMD_LEN, &len[i]); |
---|
943 | 955 | if (max < len[i]) { |
---|
.. | .. |
---|
947 | 959 | } |
---|
948 | 960 | |
---|
949 | 961 | /* wait 2 frame to start isp for fast */ |
---|
950 | | - if (dev->is_pre_on && max == 1 && !atomic_read(&dev->isp_sdev.frm_sync_seq)) |
---|
| 962 | + if (dev->is_rtt_first && max == 1 && !atomic_read(&dev->isp_sdev.frm_sync_seq)) |
---|
951 | 963 | goto end; |
---|
952 | 964 | |
---|
953 | 965 | if (max) { |
---|
.. | .. |
---|
993 | 1005 | /* first frame handle twice for thunderboot |
---|
994 | 1006 | * first output stats to AIQ and wait new params to run second |
---|
995 | 1007 | */ |
---|
996 | | - if (isp->is_pre_on && t.frame_id == 0) { |
---|
| 1008 | + if (isp->is_rtt_first && t.frame_id == 0) { |
---|
997 | 1009 | isp->is_first_double = true; |
---|
998 | 1010 | isp->skip_frame = 1; |
---|
999 | 1011 | if (hw->unite != ISP_UNITE_ONE) { |
---|
.. | .. |
---|
1001 | 1013 | isp->is_frame_double = false; |
---|
1002 | 1014 | } |
---|
1003 | 1015 | rkisp_fast_switch_rx_buf(isp, false); |
---|
| 1016 | + } else { |
---|
| 1017 | + isp->is_rtt_first = false; |
---|
1004 | 1018 | } |
---|
1005 | 1019 | isp->params_vdev.rdbk_times = isp->sw_rd_cnt + 1; |
---|
1006 | 1020 | } |
---|
.. | .. |
---|
1079 | 1093 | |
---|
1080 | 1094 | if (dev->is_first_double) { |
---|
1081 | 1095 | rkisp_fast_switch_rx_buf(dev, true); |
---|
| 1096 | + dev->is_rtt_first = false; |
---|
1082 | 1097 | dev->skip_frame = 0; |
---|
1083 | 1098 | dev->irq_ends = 0; |
---|
1084 | 1099 | return; |
---|
.. | .. |
---|
1170 | 1185 | rkisp_write(dev, CIF_ISP_IS_CTRL, 1, false); |
---|
1171 | 1186 | } |
---|
1172 | 1187 | |
---|
1173 | | -static int rkisp_reset_handle_v2x(struct rkisp_device *dev) |
---|
| 1188 | +static int rkisp_reset_handle(struct rkisp_device *dev) |
---|
1174 | 1189 | { |
---|
1175 | | - void __iomem *base = dev->base_addr; |
---|
1176 | | - void *reg_buf = NULL; |
---|
1177 | | - u32 *reg, *reg1, i; |
---|
1178 | | - struct backup_reg backup[] = { |
---|
1179 | | - { |
---|
1180 | | - .base = MI_MP_WR_Y_BASE, |
---|
1181 | | - .shd = MI_MP_WR_Y_BASE_SHD, |
---|
1182 | | - }, { |
---|
1183 | | - .base = MI_MP_WR_CB_BASE, |
---|
1184 | | - .shd = MI_MP_WR_CB_BASE_SHD, |
---|
1185 | | - }, { |
---|
1186 | | - .base = MI_MP_WR_CR_BASE, |
---|
1187 | | - .shd = MI_MP_WR_CR_BASE_SHD, |
---|
1188 | | - }, { |
---|
1189 | | - .base = MI_SP_WR_Y_BASE, |
---|
1190 | | - .shd = MI_SP_WR_Y_BASE_SHD, |
---|
1191 | | - }, { |
---|
1192 | | - .base = MI_SP_WR_CB_BASE, |
---|
1193 | | - .shd = MI_SP_WR_CB_BASE_AD_SHD, |
---|
1194 | | - }, { |
---|
1195 | | - .base = MI_SP_WR_CR_BASE, |
---|
1196 | | - .shd = MI_SP_WR_CR_BASE_AD_SHD, |
---|
1197 | | - }, { |
---|
1198 | | - .base = MI_RAW0_WR_BASE, |
---|
1199 | | - .shd = MI_RAW0_WR_BASE_SHD, |
---|
1200 | | - }, { |
---|
1201 | | - .base = MI_RAW1_WR_BASE, |
---|
1202 | | - .shd = MI_RAW1_WR_BASE_SHD, |
---|
1203 | | - }, { |
---|
1204 | | - .base = MI_RAW2_WR_BASE, |
---|
1205 | | - .shd = MI_RAW2_WR_BASE_SHD, |
---|
1206 | | - }, { |
---|
1207 | | - .base = MI_RAW3_WR_BASE, |
---|
1208 | | - .shd = MI_RAW3_WR_BASE_SHD, |
---|
1209 | | - }, { |
---|
1210 | | - .base = MI_RAW0_RD_BASE, |
---|
1211 | | - .shd = MI_RAW0_RD_BASE_SHD, |
---|
1212 | | - }, { |
---|
1213 | | - .base = MI_RAW1_RD_BASE, |
---|
1214 | | - .shd = MI_RAW1_RD_BASE_SHD, |
---|
1215 | | - }, { |
---|
1216 | | - .base = MI_RAW2_RD_BASE, |
---|
1217 | | - .shd = MI_RAW2_RD_BASE_SHD, |
---|
1218 | | - }, { |
---|
1219 | | - .base = MI_GAIN_WR_BASE, |
---|
1220 | | - .shd = MI_GAIN_WR_BASE_SHD, |
---|
1221 | | - } |
---|
1222 | | - }; |
---|
1223 | | - |
---|
1224 | | - reg_buf = kzalloc(RKISP_ISP_SW_REG_SIZE, GFP_KERNEL); |
---|
1225 | | - if (!reg_buf) |
---|
1226 | | - return -ENOMEM; |
---|
| 1190 | + u32 val; |
---|
1227 | 1191 | |
---|
1228 | 1192 | dev_info(dev->dev, "%s enter\n", __func__); |
---|
| 1193 | + rkisp_hw_reg_save(dev->hw_dev); |
---|
1229 | 1194 | |
---|
1230 | | - memcpy_fromio(reg_buf, base, RKISP_ISP_SW_REG_SIZE); |
---|
1231 | 1195 | rkisp_soft_reset(dev->hw_dev, true); |
---|
1232 | 1196 | |
---|
1233 | | - /* process special reg */ |
---|
1234 | | - reg = reg_buf + ISP_CTRL; |
---|
1235 | | - *reg &= ~(CIF_ISP_CTRL_ISP_ENABLE | |
---|
1236 | | - CIF_ISP_CTRL_ISP_INFORM_ENABLE | |
---|
1237 | | - CIF_ISP_CTRL_ISP_CFG_UPD); |
---|
1238 | | - reg = reg_buf + MI_WR_INIT; |
---|
1239 | | - *reg = 0; |
---|
1240 | | - reg = reg_buf + CSI2RX_CTRL0; |
---|
1241 | | - *reg &= ~SW_CSI2RX_EN; |
---|
1242 | | - /* skip mmu range */ |
---|
1243 | | - memcpy_toio(base, reg_buf, ISP21_MI_BAY3D_RD_BASE_SHD); |
---|
1244 | | - memcpy_toio(base + CSI2RX_CTRL0, reg_buf + CSI2RX_CTRL0, |
---|
1245 | | - RKISP_ISP_SW_REG_SIZE - CSI2RX_CTRL0); |
---|
1246 | | - /* config shd_reg to base_reg */ |
---|
1247 | | - for (i = 0; i < ARRAY_SIZE(backup); i++) { |
---|
1248 | | - reg = reg_buf + backup[i].base; |
---|
1249 | | - reg1 = reg_buf + backup[i].shd; |
---|
1250 | | - backup[i].val = *reg; |
---|
1251 | | - writel(*reg1, base + backup[i].base); |
---|
1252 | | - } |
---|
| 1197 | + rkisp_hw_reg_restore(dev->hw_dev); |
---|
| 1198 | + |
---|
| 1199 | + val = CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR; |
---|
| 1200 | + rkisp_unite_set_bits(dev, CIF_ISP_IMSC, 0, val, true); |
---|
1253 | 1201 | |
---|
1254 | 1202 | /* clear state */ |
---|
1255 | 1203 | dev->isp_err_cnt = 0; |
---|
.. | .. |
---|
1257 | 1205 | rkisp_set_state(&dev->isp_state, ISP_FRAME_END); |
---|
1258 | 1206 | dev->hw_dev->monitor.state = ISP_FRAME_END; |
---|
1259 | 1207 | |
---|
1260 | | - /* update module */ |
---|
1261 | | - reg = reg_buf + DUAL_CROP_CTRL; |
---|
1262 | | - if (*reg & 0xf) |
---|
1263 | | - writel(*reg | CIF_DUAL_CROP_CFG_UPD, base + DUAL_CROP_CTRL); |
---|
1264 | | - reg = reg_buf + SELF_RESIZE_CTRL; |
---|
1265 | | - if (*reg & 0xf) |
---|
1266 | | - writel(*reg | CIF_RSZ_CTRL_CFG_UPD, base + SELF_RESIZE_CTRL); |
---|
1267 | | - reg = reg_buf + MAIN_RESIZE_CTRL; |
---|
1268 | | - if (*reg & 0xf) |
---|
1269 | | - writel(*reg | CIF_RSZ_CTRL_CFG_UPD, base + MAIN_RESIZE_CTRL); |
---|
1270 | | - |
---|
1271 | | - /* update mi and isp, base_reg will update to shd_reg */ |
---|
1272 | | - force_cfg_update(dev); |
---|
1273 | | - reg = reg_buf + ISP_CTRL; |
---|
1274 | | - *reg |= CIF_ISP_CTRL_ISP_ENABLE | |
---|
1275 | | - CIF_ISP_CTRL_ISP_INFORM_ENABLE | |
---|
1276 | | - CIF_ISP_CTRL_ISP_CFG_UPD; |
---|
1277 | | - writel(*reg, base + ISP_CTRL); |
---|
1278 | | - udelay(50); |
---|
1279 | | - /* config base_reg */ |
---|
1280 | | - for (i = 0; i < ARRAY_SIZE(backup); i++) |
---|
1281 | | - writel(backup[i].val, base + backup[i].base); |
---|
1282 | | - /* mpfbc base_reg = shd_reg, write is base but read is shd */ |
---|
1283 | | - if (dev->isp_ver == ISP_V20) |
---|
1284 | | - writel(rkisp_read_reg_cache(dev, ISP_MPFBC_HEAD_PTR), |
---|
1285 | | - base + ISP_MPFBC_HEAD_PTR); |
---|
1286 | | - rkisp_set_bits(dev, CIF_ISP_IMSC, 0, CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR, true); |
---|
1287 | 1208 | if (IS_HDR_RDBK(dev->hdr.op_mode)) { |
---|
1288 | 1209 | if (!dev->hw_dev->is_idle) |
---|
1289 | 1210 | rkisp_trigger_read_back(dev, 1, 0, true); |
---|
1290 | 1211 | else |
---|
1291 | 1212 | rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, NULL); |
---|
1292 | 1213 | } |
---|
1293 | | - kfree(reg_buf); |
---|
1294 | 1214 | dev_info(dev->dev, "%s exit\n", __func__); |
---|
1295 | 1215 | return 0; |
---|
1296 | 1216 | } |
---|
.. | .. |
---|
1304 | 1224 | struct rkisp_pipeline *p; |
---|
1305 | 1225 | int ret, i, j, timeout = 5, mipi_irq_cnt = 0; |
---|
1306 | 1226 | |
---|
1307 | | - if (!monitor->reset_handle) { |
---|
1308 | | - monitor->is_en = false; |
---|
1309 | | - return; |
---|
1310 | | - } |
---|
1311 | | - |
---|
1312 | 1227 | dev_info(hw->dev, "%s enter\n", __func__); |
---|
1313 | 1228 | while (!(monitor->state & ISP_STOP) && monitor->is_en) { |
---|
1314 | 1229 | ret = wait_for_completion_timeout(&monitor->cmpl, |
---|
.. | .. |
---|
1316 | 1231 | /* isp stop to exit |
---|
1317 | 1232 | * isp err to reset |
---|
1318 | 1233 | * mipi err wait isp idle, then reset |
---|
| 1234 | + * online vicap if isp err, notify vicap reset, then vicap notify isp reset |
---|
| 1235 | + * by ioctl RKISP_VICAP_CMD_SET_STREAM |
---|
1319 | 1236 | */ |
---|
1320 | 1237 | if (monitor->state & ISP_STOP || |
---|
| 1238 | + monitor->state & ISP_CIF_RESET || |
---|
1321 | 1239 | (ret && !(monitor->state & ISP_ERROR)) || |
---|
1322 | 1240 | (!ret && |
---|
1323 | 1241 | monitor->state & ISP_FRAME_END && |
---|
.. | .. |
---|
1366 | 1284 | |
---|
1367 | 1285 | /* restart isp */ |
---|
1368 | 1286 | isp = hw->isp[hw->cur_dev_id]; |
---|
1369 | | - ret = monitor->reset_handle(isp); |
---|
1370 | | - if (ret) { |
---|
1371 | | - monitor->is_en = false; |
---|
1372 | | - break; |
---|
| 1287 | + if (!IS_HDR_RDBK(isp->hdr.op_mode) && isp->isp_ver >= ISP_V30) { |
---|
| 1288 | + struct v4l2_subdev *remote = NULL; |
---|
| 1289 | + struct v4l2_subdev *isp_subdev = NULL; |
---|
| 1290 | + |
---|
| 1291 | + isp_subdev = &(isp->isp_sdev.sd); |
---|
| 1292 | + remote = get_remote_sensor(isp_subdev); |
---|
| 1293 | + v4l2_subdev_call(remote, core, ioctl, |
---|
| 1294 | + RKISP_VICAP_CMD_SET_RESET, NULL); |
---|
| 1295 | + monitor->state |= ISP_CIF_RESET; |
---|
| 1296 | + continue; |
---|
| 1297 | + } else { |
---|
| 1298 | + ret = rkisp_reset_handle(isp); |
---|
| 1299 | + if (ret) { |
---|
| 1300 | + monitor->is_en = false; |
---|
| 1301 | + break; |
---|
| 1302 | + } |
---|
1373 | 1303 | } |
---|
1374 | 1304 | |
---|
1375 | 1305 | for (i = 0; i < hw->dev_num; i++) { |
---|
.. | .. |
---|
1403 | 1333 | struct rkisp_monitor *monitor = &dev->hw_dev->monitor; |
---|
1404 | 1334 | |
---|
1405 | 1335 | monitor->dev = dev->hw_dev; |
---|
1406 | | - monitor->reset_handle = NULL; |
---|
1407 | | - if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) |
---|
1408 | | - monitor->reset_handle = rkisp_reset_handle_v2x; |
---|
1409 | 1336 | |
---|
1410 | 1337 | init_completion(&monitor->cmpl); |
---|
1411 | 1338 | INIT_WORK(&monitor->work, rkisp_restart_monitor); |
---|
.. | .. |
---|
1570 | 1497 | left.win[0].win_en &= ~BIT(i); |
---|
1571 | 1498 | left.win[1].win_en &= ~BIT(i); |
---|
1572 | 1499 | left.win[2].win_en &= ~BIT(i); |
---|
| 1500 | + right.win[i].h_offs = h_offs - w + RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
1573 | 1501 | } else { |
---|
1574 | 1502 | /* cmsk window at dual isp */ |
---|
1575 | 1503 | left.win[i].h_size = ALIGN(w - h_offs, 8); |
---|
.. | .. |
---|
2927 | 2855 | { |
---|
2928 | 2856 | struct rkisp_device *isp_dev = sd_to_isp_dev(sd); |
---|
2929 | 2857 | struct rkisp_hw_dev *hw_dev = isp_dev->hw_dev; |
---|
| 2858 | + int ret; |
---|
2930 | 2859 | |
---|
2931 | 2860 | if (!on) { |
---|
2932 | 2861 | if (IS_HDR_RDBK(isp_dev->rd_mode)) { |
---|
.. | .. |
---|
2939 | 2868 | wake_up(&s->done); |
---|
2940 | 2869 | } |
---|
2941 | 2870 | } |
---|
2942 | | - wait_event_timeout(isp_dev->sync_onoff, |
---|
2943 | | - isp_dev->isp_state & ISP_STOP || |
---|
2944 | | - !IS_HDR_RDBK(isp_dev->rd_mode), |
---|
2945 | | - msecs_to_jiffies(50)); |
---|
| 2871 | + ret = wait_event_timeout(isp_dev->sync_onoff, |
---|
| 2872 | + isp_dev->isp_state & ISP_STOP || |
---|
| 2873 | + !IS_HDR_RDBK(isp_dev->rd_mode), |
---|
| 2874 | + msecs_to_jiffies(500)); |
---|
| 2875 | + if (!ret) |
---|
| 2876 | + v4l2_warn(&isp_dev->v4l2_dev, "%s wait timeout, mode:%d state:0x%x\n", |
---|
| 2877 | + __func__, isp_dev->rd_mode, isp_dev->isp_state); |
---|
2946 | 2878 | rkisp_isp_stop(isp_dev); |
---|
2947 | 2879 | atomic_dec(&hw_dev->refcnt); |
---|
2948 | 2880 | rkisp_params_stream_stop(&isp_dev->params_vdev); |
---|
.. | .. |
---|
3117 | 3049 | |
---|
3118 | 3050 | pool->dbufs = dbufs; |
---|
3119 | 3051 | v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, |
---|
3120 | | - "%s type:0x%x dbufs[%d]:%p", __func__, dbufs->type, i, dbufs); |
---|
| 3052 | + "%s type:0x%x first:%d dbufs[%d]:%p", __func__, |
---|
| 3053 | + dbufs->type, dbufs->is_first, i, dbufs); |
---|
3121 | 3054 | |
---|
3122 | 3055 | if (dbufs->is_resmem) { |
---|
3123 | 3056 | dma = dbufs->dma; |
---|
.. | .. |
---|
3483 | 3416 | return 0; |
---|
3484 | 3417 | } |
---|
3485 | 3418 | |
---|
| 3419 | +static int rkisp_set_work_mode_by_vicap(struct rkisp_device *isp_dev, |
---|
| 3420 | + struct rkisp_vicap_mode *vicap_mode) |
---|
| 3421 | +{ |
---|
| 3422 | + struct rkisp_hw_dev *hw = isp_dev->hw_dev; |
---|
| 3423 | + int rd_mode = isp_dev->rd_mode; |
---|
| 3424 | + |
---|
| 3425 | + isp_dev->is_suspend_one_frame = false; |
---|
| 3426 | + if (vicap_mode->rdbk_mode == RKISP_VICAP_ONLINE) { |
---|
| 3427 | + if (!hw->is_single) |
---|
| 3428 | + return -EINVAL; |
---|
| 3429 | + /* switch to online mode for single sensor */ |
---|
| 3430 | + switch (rd_mode) { |
---|
| 3431 | + case HDR_RDBK_FRAME3: |
---|
| 3432 | + isp_dev->rd_mode = HDR_LINEX3_DDR; |
---|
| 3433 | + break; |
---|
| 3434 | + case HDR_RDBK_FRAME2: |
---|
| 3435 | + isp_dev->rd_mode = HDR_LINEX2_DDR; |
---|
| 3436 | + break; |
---|
| 3437 | + default: |
---|
| 3438 | + isp_dev->rd_mode = HDR_NORMAL; |
---|
| 3439 | + } |
---|
| 3440 | + } else if (vicap_mode->rdbk_mode == RKISP_VICAP_RDBK_AUTO || |
---|
| 3441 | + vicap_mode->rdbk_mode == RKISP_VICAP_RDBK_AUTO_ONE_FRAME) { |
---|
| 3442 | + /* switch to readback mode */ |
---|
| 3443 | + switch (rd_mode) { |
---|
| 3444 | + case HDR_LINEX3_DDR: |
---|
| 3445 | + isp_dev->rd_mode = HDR_RDBK_FRAME3; |
---|
| 3446 | + break; |
---|
| 3447 | + case HDR_LINEX2_DDR: |
---|
| 3448 | + isp_dev->rd_mode = HDR_RDBK_FRAME2; |
---|
| 3449 | + break; |
---|
| 3450 | + default: |
---|
| 3451 | + isp_dev->rd_mode = HDR_RDBK_FRAME1; |
---|
| 3452 | + } |
---|
| 3453 | + if (vicap_mode->rdbk_mode == RKISP_VICAP_RDBK_AUTO_ONE_FRAME) |
---|
| 3454 | + isp_dev->is_suspend_one_frame = true; |
---|
| 3455 | + } else { |
---|
| 3456 | + return -EINVAL; |
---|
| 3457 | + } |
---|
| 3458 | + isp_dev->hdr.op_mode = isp_dev->rd_mode; |
---|
| 3459 | + if (rd_mode != isp_dev->rd_mode && hw->cur_dev_id == isp_dev->dev_id) { |
---|
| 3460 | + rkisp_unite_write(isp_dev, CSI2RX_CTRL0, |
---|
| 3461 | + SW_IBUF_OP_MODE(isp_dev->rd_mode), true); |
---|
| 3462 | + if (IS_HDR_RDBK(isp_dev->rd_mode)) |
---|
| 3463 | + rkisp_unite_set_bits(isp_dev, CTRL_SWS_CFG, 0, |
---|
| 3464 | + SW_MPIP_DROP_FRM_DIS, true); |
---|
| 3465 | + else |
---|
| 3466 | + rkisp_unite_clear_bits(isp_dev, CTRL_SWS_CFG, |
---|
| 3467 | + SW_MPIP_DROP_FRM_DIS, true); |
---|
| 3468 | + } |
---|
| 3469 | + return 0; |
---|
| 3470 | +} |
---|
| 3471 | + |
---|
3486 | 3472 | static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) |
---|
3487 | 3473 | { |
---|
3488 | 3474 | struct rkisp_device *isp_dev = sd_to_isp_dev(sd); |
---|
.. | .. |
---|
3508 | 3494 | rkisp_get_info(isp_dev, arg); |
---|
3509 | 3495 | break; |
---|
3510 | 3496 | case RKISP_CMD_GET_TB_HEAD_V32: |
---|
3511 | | - if (isp_dev->tb_head.complete != RKISP_TB_OK || !isp_dev->is_pre_on) { |
---|
| 3497 | + if (isp_dev->tb_head.complete != RKISP_TB_OK) { |
---|
3512 | 3498 | ret = -EINVAL; |
---|
3513 | 3499 | break; |
---|
3514 | 3500 | } |
---|
.. | .. |
---|
3606 | 3592 | isp_dev->hw_dev->is_multi_overflow = false; |
---|
3607 | 3593 | rkisp_hw_enum_isp_size(isp_dev->hw_dev); |
---|
3608 | 3594 | } |
---|
| 3595 | + break; |
---|
| 3596 | + case RKISP_VICAP_CMD_SET_STREAM: |
---|
| 3597 | + ret = rkisp_reset_handle(isp_dev); |
---|
| 3598 | + if (!ret) { |
---|
| 3599 | + if (isp_dev->hw_dev->monitor.state & ISP_CIF_RESET) |
---|
| 3600 | + isp_dev->hw_dev->monitor.state &= ~ISP_CIF_RESET; |
---|
| 3601 | + } |
---|
| 3602 | + break; |
---|
| 3603 | + case RKISP_VICAP_CMD_MODE: |
---|
| 3604 | + ret = rkisp_set_work_mode_by_vicap(isp_dev, arg); |
---|
3609 | 3605 | break; |
---|
3610 | 3606 | default: |
---|
3611 | 3607 | ret = -ENOIOCTLCMD; |
---|
.. | .. |
---|
3707 | 3703 | ret = rkisp_ioctl(sd, cmd, &module_id); |
---|
3708 | 3704 | break; |
---|
3709 | 3705 | case RKISP_CMD_MULTI_DEV_FORCE_ENUM: |
---|
| 3706 | + ret = rkisp_ioctl(sd, cmd, NULL); |
---|
| 3707 | + break; |
---|
| 3708 | + case RKISP_VICAP_CMD_SET_STREAM: |
---|
3710 | 3709 | ret = rkisp_ioctl(sd, cmd, NULL); |
---|
3711 | 3710 | break; |
---|
3712 | 3711 | default: |
---|
.. | .. |
---|
3828 | 3827 | atomic_set(&isp_sdev->frm_sync_seq, 0); |
---|
3829 | 3828 | rkisp_monitor_init(isp_dev); |
---|
3830 | 3829 | INIT_WORK(&isp_dev->rdbk_work, rkisp_rdbk_work); |
---|
| 3830 | + init_completion(&isp_dev->pm_cmpl); |
---|
3831 | 3831 | return 0; |
---|
3832 | 3832 | err_cleanup_media_entity: |
---|
3833 | 3833 | media_entity_cleanup(&sd->entity); |
---|
.. | .. |
---|
3867 | 3867 | (cond) ? 0 : -ETIMEDOUT; \ |
---|
3868 | 3868 | }) |
---|
3869 | 3869 | |
---|
3870 | | -#ifdef CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP |
---|
3871 | | -static void rkisp_save_tb_info(struct rkisp_device *isp_dev) |
---|
| 3870 | +void rkisp_save_tb_info(struct rkisp_device *isp_dev) |
---|
3872 | 3871 | { |
---|
3873 | 3872 | struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev; |
---|
3874 | 3873 | void *resmem_va = phys_to_virt(isp_dev->resmem_pa); |
---|
.. | .. |
---|
3888 | 3887 | if (size && size < isp_dev->resmem_size) { |
---|
3889 | 3888 | dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr + offset, |
---|
3890 | 3889 | size, DMA_FROM_DEVICE); |
---|
3891 | | - params_vdev->is_first_cfg = true; |
---|
| 3890 | + if (isp_dev->is_rtt_first) |
---|
| 3891 | + params_vdev->is_first_cfg = true; |
---|
3892 | 3892 | if (isp_dev->isp_ver == ISP_V32) { |
---|
3893 | 3893 | struct rkisp32_thunderboot_resmem_head *tmp = resmem_va + offset; |
---|
3894 | 3894 | |
---|
.. | .. |
---|
3900 | 3900 | tmp->cfg.module_ens, |
---|
3901 | 3901 | tmp->cfg.module_cfg_update); |
---|
3902 | 3902 | } |
---|
3903 | | - if (param) |
---|
| 3903 | + if (param && (isp_dev->isp_state & ISP_STOP)) |
---|
3904 | 3904 | params_vdev->ops->save_first_param(params_vdev, param); |
---|
3905 | 3905 | } else if (size > isp_dev->resmem_size) { |
---|
3906 | 3906 | v4l2_err(&isp_dev->v4l2_dev, |
---|
.. | .. |
---|
3911 | 3911 | memcpy(&isp_dev->tb_head, head, sizeof(*head)); |
---|
3912 | 3912 | } |
---|
3913 | 3913 | |
---|
| 3914 | +#ifdef CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP |
---|
3914 | 3915 | void rkisp_chk_tb_over(struct rkisp_device *isp_dev) |
---|
3915 | 3916 | { |
---|
3916 | 3917 | struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev; |
---|
.. | .. |
---|
3958 | 3959 | end: |
---|
3959 | 3960 | head = &isp_dev->tb_head; |
---|
3960 | 3961 | v4l2_info(&isp_dev->v4l2_dev, |
---|
3961 | | - "thunderboot info: %d, %d, %d, %d, %d, %d | %d %d\n", |
---|
| 3962 | + "tb info en:%d comp:%d cnt:%d w:%d h:%d cam:%d idx:%d\n", |
---|
3962 | 3963 | head->enable, |
---|
3963 | 3964 | head->complete, |
---|
3964 | 3965 | head->frm_total, |
---|
3965 | | - head->hdr_mode, |
---|
3966 | 3966 | head->width, |
---|
3967 | 3967 | head->height, |
---|
3968 | 3968 | head->camera_num, |
---|
.. | .. |
---|
4176 | 4176 | if (isp_mis & CIF_ISP_FRAME) |
---|
4177 | 4177 | sof_event_later = true; |
---|
4178 | 4178 | if (dev->vs_irq < 0 && !sof_event_later) { |
---|
4179 | | - dev->isp_sdev.frm_timestamp = ktime_get_ns(); |
---|
| 4179 | + dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); |
---|
4180 | 4180 | rkisp_isp_queue_event_sof(&dev->isp_sdev); |
---|
4181 | 4181 | rkisp_stream_frame_start(dev, isp_mis); |
---|
4182 | 4182 | } |
---|
.. | .. |
---|
4244 | 4244 | /* sampled input frame is complete */ |
---|
4245 | 4245 | if (isp_mis & CIF_ISP_FRAME_IN) { |
---|
4246 | 4246 | dev->isp_sdev.dbg.interval = |
---|
4247 | | - ktime_get_ns() - dev->isp_sdev.dbg.timestamp; |
---|
| 4247 | + rkisp_time_get_ns(dev) - dev->isp_sdev.dbg.timestamp; |
---|
4248 | 4248 | rkisp_set_state(&dev->isp_state, ISP_FRAME_IN); |
---|
4249 | 4249 | writel(CIF_ISP_FRAME_IN, base + CIF_ISP_ICR); |
---|
4250 | 4250 | isp_mis_tmp = readl(base + CIF_ISP_MIS); |
---|
.. | .. |
---|
4258 | 4258 | dev->rawaf_irq_cnt = 0; |
---|
4259 | 4259 | if (!dev->is_pre_on || !IS_HDR_RDBK(dev->rd_mode)) |
---|
4260 | 4260 | dev->isp_sdev.dbg.interval = |
---|
4261 | | - ktime_get_ns() - dev->isp_sdev.dbg.timestamp; |
---|
| 4261 | + rkisp_time_get_ns(dev) - dev->isp_sdev.dbg.timestamp; |
---|
4262 | 4262 | /* Clear Frame In (ISP) */ |
---|
4263 | 4263 | rkisp_set_state(&dev->isp_state, ISP_FRAME_END); |
---|
4264 | 4264 | writel(CIF_ISP_FRAME, base + CIF_ISP_ICR); |
---|
.. | .. |
---|
4278 | 4278 | u64 tmp = dev->isp_sdev.dbg.interval + |
---|
4279 | 4279 | dev->isp_sdev.dbg.timestamp; |
---|
4280 | 4280 | |
---|
4281 | | - dev->isp_sdev.dbg.timestamp = ktime_get_ns(); |
---|
| 4281 | + dev->isp_sdev.dbg.timestamp = rkisp_time_get_ns(dev); |
---|
4282 | 4282 | /* v-blank: frame(N)start - frame(N-1)end */ |
---|
4283 | 4283 | dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp; |
---|
4284 | 4284 | } |
---|
.. | .. |
---|
4330 | 4330 | |
---|
4331 | 4331 | /* cur frame end and next frame start irq togeter */ |
---|
4332 | 4332 | if (dev->vs_irq < 0 && sof_event_later) { |
---|
4333 | | - dev->isp_sdev.frm_timestamp = ktime_get_ns(); |
---|
| 4333 | + dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); |
---|
4334 | 4334 | rkisp_isp_queue_event_sof(&dev->isp_sdev); |
---|
4335 | 4335 | rkisp_stream_frame_start(dev, isp_mis); |
---|
4336 | 4336 | } |
---|