Lines Matching full:cfe

44 #include "cfe-fmts.h"
45 #include "cfe.h"
50 #include "cfe-trace.h"
52 #define CFE_MODULE_NAME "rp1-cfe"
55 #define cfe_dbg(cfe, fmt, arg...) dev_dbg(&(cfe)->pdev->dev, fmt, ##arg) argument
56 #define cfe_info(cfe, fmt, arg...) dev_info(&(cfe)->pdev->dev, fmt, ##arg) argument
57 #define cfe_err(cfe, fmt, arg...) dev_err(&(cfe)->pdev->dev, fmt, ##arg) argument
262 struct cfe_device *cfe; member
312 static inline bool is_fe_enabled(struct cfe_device *cfe) in is_fe_enabled() argument
314 return cfe->fe_csi2_channel != -1; in is_fe_enabled()
322 static inline u32 cfg_reg_read(struct cfe_device *cfe, u32 offset) in cfg_reg_read() argument
324 return readl(cfe->mipi_cfg_base + offset); in cfg_reg_read()
327 static inline void cfg_reg_write(struct cfe_device *cfe, u32 offset, u32 val) in cfg_reg_write() argument
329 writel(val, cfe->mipi_cfg_base + offset); in cfg_reg_write()
332 static bool check_state(struct cfe_device *cfe, unsigned long state, in check_state() argument
338 if (!test_bit(bit + (node_id * NUM_STATES), cfe->node_flags)) in check_state()
345 static void set_state(struct cfe_device *cfe, unsigned long state, in set_state() argument
351 set_bit(bit + (node_id * NUM_STATES), cfe->node_flags); in set_state()
354 static void clear_state(struct cfe_device *cfe, unsigned long state, in clear_state() argument
360 clear_bit(bit + (node_id * NUM_STATES), cfe->node_flags); in clear_state()
363 static bool test_any_node(struct cfe_device *cfe, unsigned long cond) in test_any_node() argument
366 if (check_state(cfe, cond, i)) in test_any_node()
373 static bool test_all_nodes(struct cfe_device *cfe, unsigned long precond, in test_all_nodes() argument
377 if (check_state(cfe, precond, i)) { in test_all_nodes()
378 if (!check_state(cfe, cond, i)) in test_all_nodes()
388 struct cfe_device *cfe = s->private; in mipi_cfg_regs_show() local
391 ret = pm_runtime_resume_and_get(&cfe->pdev->dev); in mipi_cfg_regs_show()
395 #define DUMP(reg) seq_printf(s, #reg " \t0x%08x\n", cfg_reg_read(cfe, reg)) in mipi_cfg_regs_show()
403 pm_runtime_put(&cfe->pdev->dev); in mipi_cfg_regs_show()
482 static void cfe_calc_vid_format_size_bpl(struct cfe_device *cfe, in cfe_calc_vid_format_size_bpl() argument
503 cfe_dbg(cfe, "%s: %p4cc size: %ux%u bpl:%u img_size:%u\n", __func__, in cfe_calc_vid_format_size_bpl()
508 static void cfe_calc_meta_format_size_bpl(struct cfe_device *cfe, in cfe_calc_meta_format_size_bpl() argument
519 cfe_dbg(cfe, "%s: %p4cc size: %ux%u bpl:%u buf_size:%u\n", __func__, in cfe_calc_meta_format_size_bpl()
524 static void cfe_schedule_next_csi2_job(struct cfe_device *cfe) in cfe_schedule_next_csi2_job() argument
530 struct cfe_node *node = &cfe->node[i]; in cfe_schedule_next_csi2_job()
533 if (!check_state(cfe, NODE_STREAMING, i)) in cfe_schedule_next_csi2_job()
553 csi2_set_buffer(&cfe->csi2, node->id, addr, stride, size); in cfe_schedule_next_csi2_job()
557 static void cfe_schedule_next_pisp_job(struct cfe_device *cfe) in cfe_schedule_next_pisp_job() argument
564 struct cfe_node *node = &cfe->node[i]; in cfe_schedule_next_pisp_job()
566 if (!check_state(cfe, NODE_STREAMING, i)) in cfe_schedule_next_pisp_job()
579 config_buf = to_cfe_config_buffer(cfe->node[FE_CONFIG].next_frm); in cfe_schedule_next_pisp_job()
580 pisp_fe_submit_job(&cfe->fe, vb2_bufs, &config_buf->config); in cfe_schedule_next_pisp_job()
583 static bool cfe_check_job_ready(struct cfe_device *cfe) in cfe_check_job_ready() argument
586 struct cfe_node *node = &cfe->node[i]; in cfe_check_job_ready()
588 if (!check_state(cfe, NODE_ENABLED, i)) in cfe_check_job_ready()
598 static void cfe_prepare_next_job(struct cfe_device *cfe) in cfe_prepare_next_job() argument
600 trace_cfe_prepare_next_job(is_fe_enabled(cfe)); in cfe_prepare_next_job()
602 cfe->job_queued = true; in cfe_prepare_next_job()
603 cfe_schedule_next_csi2_job(cfe); in cfe_prepare_next_job()
604 if (is_fe_enabled(cfe)) in cfe_prepare_next_job()
605 cfe_schedule_next_pisp_job(cfe); in cfe_prepare_next_job()
608 cfe->job_ready = cfe_check_job_ready(cfe); in cfe_prepare_next_job()
632 struct cfe_device *cfe = node->cfe; in cfe_sof_isr() local
654 if (!check_state(cfe, NODE_STREAMING, i) || i == node->id) in cfe_sof_isr()
660 if (cfe->node[i].fs_count >= node->fs_count) in cfe_sof_isr()
661 node->ts = cfe->node[i].ts; in cfe_sof_isr()
666 if (matching_fs && cfe->node[i].fs_count != node->fs_count) in cfe_sof_isr()
671 cfe->job_queued = false; in cfe_sof_isr()
676 set_state(cfe, FS_INT, node->id); in cfe_sof_isr()
677 clear_state(cfe, FE_INT, node->id); in cfe_sof_isr()
685 struct cfe_device *cfe = node->cfe; in cfe_eof_isr() local
693 set_state(cfe, FE_INT, node->id); in cfe_eof_isr()
694 clear_state(cfe, FS_INT, node->id); in cfe_eof_isr()
699 struct cfe_device *cfe = dev; in cfe_isr() local
703 sts = cfg_reg_read(cfe, MIPICFG_INTS); in cfe_isr()
706 csi2_isr(&cfe->csi2, sof, eof); in cfe_isr()
709 pisp_fe_isr(&cfe->fe, sof + CSI2_NUM_CHANNELS, in cfe_isr()
712 spin_lock(&cfe->state_lock); in cfe_isr()
715 struct cfe_node *node = &cfe->node[i]; in cfe_isr()
722 if (!check_state(cfe, NODE_STREAMING, i) || !(sof[i] || eof[i])) in cfe_isr()
742 if (sof[i] && !check_state(cfe, FS_INT, i)) { in cfe_isr()
759 if (check_state(cfe, FS_INT, node->id) && in cfe_isr()
760 !check_state(cfe, FE_INT, node->id)) { in cfe_isr()
761 cfe_dbg(cfe, "%s: [%s] Handling missing previous FE interrupt\n", in cfe_isr()
769 if (!cfe->job_queued && cfe->job_ready) in cfe_isr()
770 cfe_prepare_next_job(cfe); in cfe_isr()
773 spin_unlock(&cfe->state_lock); in cfe_isr()
782 static int cfe_get_vc_dt_fallback(struct cfe_device *cfe, u8 *vc, u8 *dt) in cfe_get_vc_dt_fallback() argument
788 state = v4l2_subdev_get_locked_active_state(&cfe->csi2.sd); in cfe_get_vc_dt_fallback()
804 static int cfe_get_vc_dt(struct cfe_device *cfe, unsigned int channel, u8 *vc, in cfe_get_vc_dt() argument
813 state = v4l2_subdev_get_locked_active_state(&cfe->csi2.sd); in cfe_get_vc_dt()
820 ret = v4l2_subdev_call(cfe->source_sd, pad, get_frame_desc, in cfe_get_vc_dt()
821 cfe->source_pad, &remote_desc); in cfe_get_vc_dt()
823 cfe_dbg(cfe, "source does not support get_frame_desc, use fallback\n"); in cfe_get_vc_dt()
824 return cfe_get_vc_dt_fallback(cfe, vc, dt); in cfe_get_vc_dt()
826 cfe_err(cfe, "Failed to get frame descriptor\n"); in cfe_get_vc_dt()
831 cfe_err(cfe, "Frame descriptor does not describe CSI-2 link"); in cfe_get_vc_dt()
841 cfe_err(cfe, "Stream %u not found in remote frame desc\n", in cfe_get_vc_dt()
854 struct cfe_device *cfe = node->cfe; in cfe_start_channel() local
862 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_start_channel()
864 start_fe = is_fe_enabled(cfe) && in cfe_start_channel()
865 test_all_nodes(cfe, NODE_ENABLED, NODE_STREAMING); in cfe_start_channel()
867 state = v4l2_subdev_get_locked_active_state(&cfe->csi2.sd); in cfe_start_channel()
873 cfe_dbg(cfe, "%s: %s using csi2 channel %d\n", __func__, in cfe_start_channel()
874 node_desc[FE_OUT0].name, cfe->fe_csi2_channel); in cfe_start_channel()
876 ret = cfe_get_vc_dt(cfe, cfe->fe_csi2_channel, &vc, &dt); in cfe_start_channel()
881 node_desc[cfe->fe_csi2_channel].link_pad); in cfe_start_channel()
897 csi2_start_channel(&cfe->csi2, cfe->fe_csi2_channel, in cfe_start_channel()
900 csi2_set_buffer(&cfe->csi2, cfe->fe_csi2_channel, 0, 0, -1); in cfe_start_channel()
901 pisp_fe_start(&cfe->fe); in cfe_start_channel()
908 ret = cfe_get_vc_dt(cfe, node->id, &vc, &dt); in cfe_start_channel()
911 csi2_stop_channel(&cfe->csi2, in cfe_start_channel()
912 cfe->fe_csi2_channel); in cfe_start_channel()
913 pisp_fe_stop(&cfe->fe); in cfe_start_channel()
940 csi2_set_compression(&cfe->csi2, node->id, in cfe_start_channel()
946 csi2_start_channel(&cfe->csi2, node->id, in cfe_start_channel()
955 spin_lock_irqsave(&cfe->state_lock, flags); in cfe_start_channel()
956 if (cfe->job_ready && test_all_nodes(cfe, NODE_ENABLED, NODE_STREAMING)) in cfe_start_channel()
957 cfe_prepare_next_job(cfe); in cfe_start_channel()
958 spin_unlock_irqrestore(&cfe->state_lock, flags); in cfe_start_channel()
965 struct cfe_device *cfe = node->cfe; in cfe_stop_channel() local
967 cfe_dbg(cfe, "%s: [%s] fe_stop %u\n", __func__, in cfe_stop_channel()
971 csi2_stop_channel(&cfe->csi2, cfe->fe_csi2_channel); in cfe_stop_channel()
972 pisp_fe_stop(&cfe->fe); in cfe_stop_channel()
976 csi2_stop_channel(&cfe->csi2, node->id); in cfe_stop_channel()
982 struct cfe_device *cfe = node->cfe; in cfe_return_buffers() local
986 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_return_buffers()
988 spin_lock_irqsave(&cfe->state_lock, flags); in cfe_return_buffers()
1008 spin_unlock_irqrestore(&cfe->state_lock, flags); in cfe_return_buffers()
1020 struct cfe_device *cfe = node->cfe; in cfe_queue_setup() local
1025 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_queue_setup()
1033 cfe_err(cfe, "sizes[0] %i < size %u\n", sizes[0], size); in cfe_queue_setup()
1048 struct cfe_device *cfe = node->cfe; in cfe_buffer_prepare() local
1057 cfe_err(cfe, "data will not fit into plane (%lu < %lu)\n", in cfe_buffer_prepare()
1069 return pisp_fe_validate_config(&cfe->fe, &b->config, in cfe_buffer_prepare()
1070 &cfe->node[FE_OUT0].vid_fmt, in cfe_buffer_prepare()
1071 &cfe->node[FE_OUT1].vid_fmt); in cfe_buffer_prepare()
1080 struct cfe_device *cfe = node->cfe; in cfe_buffer_queue() local
1085 spin_lock_irqsave(&cfe->state_lock, flags); in cfe_buffer_queue()
1089 if (!cfe->job_ready) in cfe_buffer_queue()
1090 cfe->job_ready = cfe_check_job_ready(cfe); in cfe_buffer_queue()
1092 schedule_now = !cfe->job_queued && cfe->job_ready && in cfe_buffer_queue()
1093 test_all_nodes(cfe, NODE_ENABLED, NODE_STREAMING); in cfe_buffer_queue()
1098 cfe_prepare_next_job(cfe); in cfe_buffer_queue()
1100 spin_unlock_irqrestore(&cfe->state_lock, flags); in cfe_buffer_queue()
1103 static s64 cfe_get_source_link_freq(struct cfe_device *cfe) in cfe_get_source_link_freq() argument
1109 state = v4l2_subdev_get_locked_active_state(&cfe->csi2.sd); in cfe_get_source_link_freq()
1139 link_freq = v4l2_get_link_freq(cfe->source_sd->ctrl_handler, bpp, in cfe_get_source_link_freq()
1140 2 * cfe->csi2.dphy.active_lanes); in cfe_get_source_link_freq()
1142 cfe_err(cfe, "failed to get link freq for subdev '%s'\n", in cfe_get_source_link_freq()
1143 cfe->source_sd->name); in cfe_get_source_link_freq()
1152 struct cfe_device *cfe = node->cfe; in cfe_start_streaming() local
1158 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_start_streaming()
1160 if (!check_state(cfe, NODE_ENABLED, node->id)) { in cfe_start_streaming()
1161 cfe_err(cfe, "%s node link is not enabled.\n", in cfe_start_streaming()
1167 ret = pm_runtime_resume_and_get(&cfe->pdev->dev); in cfe_start_streaming()
1169 cfe_err(cfe, "pm_runtime_resume_and_get failed\n"); in cfe_start_streaming()
1174 if (is_fe_enabled(cfe) && in cfe_start_streaming()
1175 !check_state(cfe, NODE_ENABLED, cfe->node[FE_CONFIG].id)) { in cfe_start_streaming()
1176 cfe_err(cfe, "FE enabled, but FE_CONFIG node is not\n"); in cfe_start_streaming()
1181 ret = media_pipeline_start(&node->pad, &cfe->pipe); in cfe_start_streaming()
1183 cfe_err(cfe, "Failed to start media pipeline: %d\n", ret); in cfe_start_streaming()
1187 state = v4l2_subdev_lock_and_get_active_state(&cfe->csi2.sd); in cfe_start_streaming()
1189 clear_state(cfe, FS_INT | FE_INT, node->id); in cfe_start_streaming()
1190 set_state(cfe, NODE_STREAMING, node->id); in cfe_start_streaming()
1197 if (!test_all_nodes(cfe, NODE_ENABLED, NODE_STREAMING)) { in cfe_start_streaming()
1198 cfe_dbg(cfe, "Streaming on hold, as all nodes are not set to streaming yet\n"); in cfe_start_streaming()
1203 cfg_reg_write(cfe, MIPICFG_CFG, MIPICFG_CFG_SEL_CSI); in cfe_start_streaming()
1204 cfg_reg_write(cfe, MIPICFG_INTE, in cfe_start_streaming()
1207 ret = v4l2_subdev_call(cfe->source_sd, pad, get_mbus_config, 0, in cfe_start_streaming()
1210 cfe_err(cfe, "g_mbus_config failed\n"); in cfe_start_streaming()
1214 cfe->csi2.dphy.active_lanes = mbus_config.bus.mipi_csi2.num_data_lanes; in cfe_start_streaming()
1215 if (!cfe->csi2.dphy.active_lanes) in cfe_start_streaming()
1216 cfe->csi2.dphy.active_lanes = cfe->csi2.dphy.max_lanes; in cfe_start_streaming()
1217 if (cfe->csi2.dphy.active_lanes > cfe->csi2.dphy.max_lanes) { in cfe_start_streaming()
1218 cfe_err(cfe, "Device has requested %u data lanes, which is >%u configured in DT\n", in cfe_start_streaming()
1219 cfe->csi2.dphy.active_lanes, cfe->csi2.dphy.max_lanes); in cfe_start_streaming()
1224 link_freq = cfe_get_source_link_freq(cfe); in cfe_start_streaming()
1228 cfe->csi2.dphy.dphy_rate = div_s64(link_freq * 2, 1000000); in cfe_start_streaming()
1229 csi2_open_rx(&cfe->csi2); in cfe_start_streaming()
1231 cfe->streams_mask = 0; in cfe_start_streaming()
1234 cfe->streams_mask |= BIT_ULL(route->sink_stream); in cfe_start_streaming()
1236 ret = v4l2_subdev_enable_streams(cfe->source_sd, cfe->source_pad, in cfe_start_streaming()
1237 cfe->streams_mask); in cfe_start_streaming()
1239 cfe_err(cfe, "stream on failed in subdev\n"); in cfe_start_streaming()
1243 cfe_dbg(cfe, "Streaming enabled\n"); in cfe_start_streaming()
1250 csi2_close_rx(&cfe->csi2); in cfe_start_streaming()
1252 cfg_reg_write(cfe, MIPICFG_INTE, 0); in cfe_start_streaming()
1255 is_fe_enabled(cfe) && test_all_nodes(cfe, NODE_ENABLED, in cfe_start_streaming()
1261 pm_runtime_put(&cfe->pdev->dev); in cfe_start_streaming()
1264 clear_state(cfe, NODE_STREAMING, node->id); in cfe_start_streaming()
1272 struct cfe_device *cfe = node->cfe; in cfe_stop_streaming() local
1276 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_stop_streaming()
1278 spin_lock_irqsave(&cfe->state_lock, flags); in cfe_stop_streaming()
1279 fe_stop = is_fe_enabled(cfe) && in cfe_stop_streaming()
1280 test_all_nodes(cfe, NODE_ENABLED, NODE_STREAMING); in cfe_stop_streaming()
1282 cfe->job_ready = false; in cfe_stop_streaming()
1283 clear_state(cfe, NODE_STREAMING, node->id); in cfe_stop_streaming()
1284 spin_unlock_irqrestore(&cfe->state_lock, flags); in cfe_stop_streaming()
1288 if (!test_any_node(cfe, NODE_STREAMING)) { in cfe_stop_streaming()
1292 state = v4l2_subdev_lock_and_get_active_state(&cfe->csi2.sd); in cfe_stop_streaming()
1294 ret = v4l2_subdev_disable_streams(cfe->source_sd, in cfe_stop_streaming()
1295 cfe->source_pad, in cfe_stop_streaming()
1296 cfe->streams_mask); in cfe_stop_streaming()
1298 cfe_err(cfe, "stream disable failed in subdev\n"); in cfe_stop_streaming()
1302 csi2_close_rx(&cfe->csi2); in cfe_stop_streaming()
1304 cfg_reg_write(cfe, MIPICFG_INTE, 0); in cfe_stop_streaming()
1306 cfe_dbg(cfe, "%s: Streaming disabled\n", __func__); in cfe_stop_streaming()
1314 pm_runtime_put(&cfe->pdev->dev); in cfe_stop_streaming()
1347 struct cfe_device *cfe = node->cfe; in cfe_enum_fmt_vid_cap() local
1353 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_fmt_vid_cap()
1393 struct cfe_device *cfe = node->cfe; in cfe_validate_fmt_vid_cap() local
1396 cfe_dbg(cfe, "%s: [%s] %ux%u, V4L2 pix %p4cc\n", __func__, in cfe_validate_fmt_vid_cap()
1419 cfe_calc_vid_format_size_bpl(cfe, fmt, f); in cfe_validate_fmt_vid_cap()
1428 struct cfe_device *cfe = node->cfe; in cfe_s_fmt_vid_cap() local
1441 cfe_dbg(cfe, "%s: Set %ux%u, V4L2 pix %p4cc\n", __func__, in cfe_s_fmt_vid_cap()
1452 struct cfe_device *cfe = node->cfe; in cfe_try_fmt_vid_cap() local
1454 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_try_fmt_vid_cap()
1463 struct cfe_device *cfe = node->cfe; in cfe_enum_fmt_meta() local
1465 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_fmt_meta()
1508 struct cfe_device *cfe = node->cfe; in cfe_validate_fmt_meta() local
1513 cfe_dbg(cfe, "%s: [%s] %ux%u, V4L2 meta %p4cc\n", __func__, in cfe_validate_fmt_meta()
1519 cfe_dbg(cfe, "%s: [%s] %u bytes, V4L2 meta %p4cc\n", __func__, in cfe_validate_fmt_meta()
1538 cfe_calc_meta_format_size_bpl(cfe, fmt, f); in cfe_validate_fmt_meta()
1557 struct cfe_device *cfe = node->cfe; in cfe_g_fmt_meta() local
1559 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_g_fmt_meta()
1572 struct cfe_device *cfe = node->cfe; in cfe_s_fmt_meta() local
1576 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_s_fmt_meta()
1590 cfe_dbg(cfe, "%s: Set %p4cc\n", __func__, in cfe_s_fmt_meta()
1600 struct cfe_device *cfe = node->cfe; in cfe_try_fmt_meta() local
1602 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_try_fmt_meta()
1610 struct cfe_device *cfe = node->cfe; in cfe_enum_framesizes() local
1613 cfe_dbg(cfe, "%s [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_framesizes()
1621 cfe_dbg(cfe, "Invalid pixel code: %x\n", fsize->pixel_format); in cfe_enum_framesizes()
1643 struct cfe_device *cfe = node->cfe; in cfe_vb2_ioctl_reqbufs() local
1646 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_vb2_ioctl_reqbufs()
1666 struct cfe_device *cfe = node->cfe; in cfe_vb2_ioctl_create_bufs() local
1669 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_vb2_ioctl_create_bufs()
1742 struct cfe_device *cfe = to_cfe_device(sd->v4l2_dev); in cfe_notify() local
1747 struct cfe_node *node = &cfe->node[i]; in cfe_notify()
1749 if (check_state(cfe, NODE_REGISTERED, i)) in cfe_notify()
1760 /* cfe capture driver file operations */
1775 struct cfe_device *cfe = node->cfe; in cfe_video_link_validate() local
1781 cfe_dbg(cfe, "%s: [%s] link \"%s\":%u -> \"%s\":%u\n", __func__, in cfe_video_link_validate()
1787 cfe_err(cfe, "video node %s pad not connected\n", vd->name); in cfe_video_link_validate()
1807 cfe_err(cfe, "Wrong width or height %ux%u (remote pad set to %ux%u)\n", in cfe_video_link_validate()
1817 cfe_err(cfe, "Format mismatch!\n"); in cfe_video_link_validate()
1827 cfe_err(cfe, "Wrong width or height %ux%u (remote pad set to %ux%u)\n", in cfe_video_link_validate()
1837 cfe_err(cfe, "Format mismatch!\n"); in cfe_video_link_validate()
1857 struct cfe_device *cfe = container_of(mdev, struct cfe_device, mdev); in cfe_video_link_notify() local
1858 struct media_entity *fe = &cfe->fe.sd.entity; in cfe_video_link_notify()
1859 struct media_entity *csi2 = &cfe->csi2.sd.entity; in cfe_video_link_notify()
1865 cfe_dbg(cfe, "%s: %s[%u] -> %s[%u] 0x%x", __func__, in cfe_video_link_notify()
1869 spin_lock_irqsave(&cfe->state_lock, lock_flags); in cfe_video_link_notify()
1872 if (link->sink->entity != &cfe->node[i].video_dev.entity && in cfe_video_link_notify()
1873 link->source->entity != &cfe->node[i].video_dev.entity) in cfe_video_link_notify()
1877 set_state(cfe, NODE_ENABLED, i); in cfe_video_link_notify()
1879 clear_state(cfe, NODE_ENABLED, i); in cfe_video_link_notify()
1884 spin_unlock_irqrestore(&cfe->state_lock, lock_flags); in cfe_video_link_notify()
1893 cfe->fe_csi2_channel = -1; in cfe_video_link_notify()
1896 cfe->fe_csi2_channel = CSI2_CH0; in cfe_video_link_notify()
1898 cfe->fe_csi2_channel = CSI2_CH1; in cfe_video_link_notify()
1900 cfe->fe_csi2_channel = CSI2_CH2; in cfe_video_link_notify()
1902 cfe->fe_csi2_channel = CSI2_CH3; in cfe_video_link_notify()
1905 if (is_fe_enabled(cfe)) in cfe_video_link_notify()
1906 cfe_dbg(cfe, "%s: Found CSI2:%d -> FE:0 link\n", __func__, in cfe_video_link_notify()
1907 cfe->fe_csi2_channel); in cfe_video_link_notify()
1909 cfe_dbg(cfe, "%s: Unable to find CSI2:x -> FE:0 link\n", in cfe_video_link_notify()
1921 struct cfe_device *cfe = container_of(kref, struct cfe_device, kref); in cfe_release() local
1923 media_device_cleanup(&cfe->mdev); in cfe_release()
1925 kfree(cfe); in cfe_release()
1928 static void cfe_put(struct cfe_device *cfe) in cfe_put() argument
1930 kref_put(&cfe->kref, cfe_release); in cfe_put()
1933 static void cfe_get(struct cfe_device *cfe) in cfe_get() argument
1935 kref_get(&cfe->kref); in cfe_get()
1942 cfe_put(node->cfe); in cfe_node_release()
1945 static int cfe_register_node(struct cfe_device *cfe, int id) in cfe_register_node() argument
1950 struct cfe_node *node = &cfe->node[id]; in cfe_register_node()
1953 node->cfe = cfe; in cfe_register_node()
1964 cfe_err(cfe, "Failed to find format code\n"); in cfe_register_node()
2002 q->dev = &cfe->pdev->dev; in cfe_register_node()
2006 cfe_err(cfe, "vb2_queue_init() failed\n"); in cfe_register_node()
2017 vdev->v4l2_dev = &cfe->v4l2_dev; in cfe_register_node()
2043 cfe_err(cfe, "Unable to register video device %s\n", in cfe_register_node()
2048 cfe_info(cfe, "Registered [%s] node id %d as /dev/video%u\n", in cfe_register_node()
2052 * Acquire a reference to cfe, which will be released when the video in cfe_register_node()
2056 cfe_get(cfe); in cfe_register_node()
2057 set_state(cfe, NODE_REGISTERED, id); in cfe_register_node()
2062 static void cfe_unregister_nodes(struct cfe_device *cfe) in cfe_unregister_nodes() argument
2065 struct cfe_node *node = &cfe->node[i]; in cfe_unregister_nodes()
2067 if (check_state(cfe, NODE_REGISTERED, i)) { in cfe_unregister_nodes()
2068 clear_state(cfe, NODE_REGISTERED, i); in cfe_unregister_nodes()
2074 static int cfe_link_node_pads(struct cfe_device *cfe) in cfe_link_node_pads() argument
2081 ret = v4l2_create_fwnode_links_to_pad(cfe->source_sd, in cfe_link_node_pads()
2082 &cfe->csi2.pad[CSI2_PAD_SINK], in cfe_link_node_pads()
2086 cfe_err(cfe, "Failed to create links to the source: %d\n", ret); in cfe_link_node_pads()
2090 remote_pad = media_pad_remote_pad_unique(&cfe->csi2.pad[CSI2_PAD_SINK]); in cfe_link_node_pads()
2093 cfe_err(cfe, "Failed to get unique remote source pad: %d\n", in cfe_link_node_pads()
2098 cfe->source_pad = remote_pad->index; in cfe_link_node_pads()
2101 struct cfe_node *node = &cfe->node[i]; in cfe_link_node_pads()
2103 if (!check_state(cfe, NODE_REGISTERED, i)) in cfe_link_node_pads()
2107 ret = media_create_pad_link(&cfe->csi2.sd.entity, in cfe_link_node_pads()
2115 ret = media_create_pad_link(&cfe->csi2.sd.entity, in cfe_link_node_pads()
2117 &cfe->fe.sd.entity, in cfe_link_node_pads()
2125 struct cfe_node *node = &cfe->node[i]; in cfe_link_node_pads()
2131 src = &cfe->fe.sd.entity; in cfe_link_node_pads()
2137 dst = &cfe->fe.sd.entity; in cfe_link_node_pads()
2151 static int cfe_probe_complete(struct cfe_device *cfe) in cfe_probe_complete() argument
2155 cfe->v4l2_dev.notify = cfe_notify; in cfe_probe_complete()
2158 ret = cfe_register_node(cfe, i); in cfe_probe_complete()
2160 cfe_err(cfe, "Unable to register video node %u.\n", i); in cfe_probe_complete()
2165 ret = cfe_link_node_pads(cfe); in cfe_probe_complete()
2167 cfe_err(cfe, "Unable to link node pads.\n"); in cfe_probe_complete()
2171 ret = v4l2_device_register_subdev_nodes(&cfe->v4l2_dev); in cfe_probe_complete()
2173 cfe_err(cfe, "Unable to register subdev nodes.\n"); in cfe_probe_complete()
2180 cfe_unregister_nodes(cfe); in cfe_probe_complete()
2188 struct cfe_device *cfe = to_cfe_device(notifier->v4l2_dev); in cfe_async_bound() local
2190 if (cfe->source_sd) { in cfe_async_bound()
2191 cfe_err(cfe, "Rejecting subdev %s (Already set!!)", in cfe_async_bound()
2196 cfe->source_sd = subdev; in cfe_async_bound()
2198 cfe_dbg(cfe, "Using source %s for capture\n", subdev->name); in cfe_async_bound()
2205 struct cfe_device *cfe = to_cfe_device(notifier->v4l2_dev); in cfe_async_complete() local
2207 return cfe_probe_complete(cfe); in cfe_async_complete()
2215 static int cfe_register_async_nf(struct cfe_device *cfe) in cfe_register_async_nf() argument
2217 struct platform_device *pdev = cfe->pdev; in cfe_register_async_nf()
2226 cfe_err(cfe, "Failed to find local endpoint fwnode\n"); in cfe_register_async_nf()
2233 cfe_err(cfe, "Failed to find remote endpoint fwnode\n"); in cfe_register_async_nf()
2240 cfe_err(cfe, "Data lanes reordering not supported\n"); in cfe_register_async_nf()
2246 cfe->csi2.dphy.max_lanes = ep.bus.mipi_csi2.num_data_lanes; in cfe_register_async_nf()
2247 cfe->csi2.bus_flags = ep.bus.mipi_csi2.flags; in cfe_register_async_nf()
2250 v4l2_async_nf_init(&cfe->notifier, &cfe->v4l2_dev); in cfe_register_async_nf()
2251 cfe->notifier.ops = &cfe_async_ops; in cfe_register_async_nf()
2253 asd = v4l2_async_nf_add_fwnode_remote(&cfe->notifier, local_ep_fwnode, in cfe_register_async_nf()
2257 cfe_err(cfe, "Error adding subdevice: %d\n", ret); in cfe_register_async_nf()
2261 ret = v4l2_async_nf_register(&cfe->notifier); in cfe_register_async_nf()
2263 cfe_err(cfe, "Error registering async notifier: %d\n", ret); in cfe_register_async_nf()
2272 v4l2_async_nf_cleanup(&cfe->notifier); in cfe_register_async_nf()
2281 struct cfe_device *cfe; in cfe_probe() local
2285 cfe = kzalloc(sizeof(*cfe), GFP_KERNEL); in cfe_probe()
2286 if (!cfe) in cfe_probe()
2289 platform_set_drvdata(pdev, cfe); in cfe_probe()
2291 kref_init(&cfe->kref); in cfe_probe()
2292 cfe->pdev = pdev; in cfe_probe()
2293 cfe->fe_csi2_channel = -1; in cfe_probe()
2294 spin_lock_init(&cfe->state_lock); in cfe_probe()
2296 cfe->csi2.base = devm_platform_ioremap_resource(pdev, 0); in cfe_probe()
2297 if (IS_ERR(cfe->csi2.base)) { in cfe_probe()
2299 ret = PTR_ERR(cfe->csi2.base); in cfe_probe()
2303 cfe->csi2.dphy.base = devm_platform_ioremap_resource(pdev, 1); in cfe_probe()
2304 if (IS_ERR(cfe->csi2.dphy.base)) { in cfe_probe()
2306 ret = PTR_ERR(cfe->csi2.dphy.base); in cfe_probe()
2310 cfe->mipi_cfg_base = devm_platform_ioremap_resource(pdev, 2); in cfe_probe()
2311 if (IS_ERR(cfe->mipi_cfg_base)) { in cfe_probe()
2313 ret = PTR_ERR(cfe->mipi_cfg_base); in cfe_probe()
2317 cfe->fe.base = devm_platform_ioremap_resource(pdev, 3); in cfe_probe()
2318 if (IS_ERR(cfe->fe.base)) { in cfe_probe()
2320 ret = PTR_ERR(cfe->fe.base); in cfe_probe()
2330 ret = devm_request_irq(&pdev->dev, ret, cfe_isr, 0, "rp1-cfe", cfe); in cfe_probe()
2348 cfe->clk = devm_clk_get(&pdev->dev, NULL); in cfe_probe()
2349 if (IS_ERR(cfe->clk)) { in cfe_probe()
2350 ret = dev_err_probe(&pdev->dev, PTR_ERR(cfe->clk), in cfe_probe()
2355 cfe->mdev.dev = &pdev->dev; in cfe_probe()
2356 cfe->mdev.ops = &cfe_media_device_ops; in cfe_probe()
2357 strscpy(cfe->mdev.model, CFE_MODULE_NAME, sizeof(cfe->mdev.model)); in cfe_probe()
2358 strscpy(cfe->mdev.serial, "", sizeof(cfe->mdev.serial)); in cfe_probe()
2359 snprintf(cfe->mdev.bus_info, sizeof(cfe->mdev.bus_info), "platform:%s", in cfe_probe()
2362 media_device_init(&cfe->mdev); in cfe_probe()
2364 cfe->v4l2_dev.mdev = &cfe->mdev; in cfe_probe()
2366 ret = v4l2_device_register(&pdev->dev, &cfe->v4l2_dev); in cfe_probe()
2368 cfe_err(cfe, "Unable to register v4l2 device.\n"); in cfe_probe()
2372 snprintf(debugfs_name, sizeof(debugfs_name), "rp1-cfe:%s", in cfe_probe()
2374 cfe->debugfs = debugfs_create_dir(debugfs_name, NULL); in cfe_probe()
2375 debugfs_create_file("regs", 0440, cfe->debugfs, cfe, in cfe_probe()
2381 ret = pm_runtime_resume_and_get(&cfe->pdev->dev); in cfe_probe()
2385 cfe->csi2.v4l2_dev = &cfe->v4l2_dev; in cfe_probe()
2386 ret = csi2_init(&cfe->csi2, cfe->debugfs); in cfe_probe()
2388 cfe_err(cfe, "Failed to init csi2 (%d)\n", ret); in cfe_probe()
2392 cfe->fe.v4l2_dev = &cfe->v4l2_dev; in cfe_probe()
2393 ret = pisp_fe_init(&cfe->fe, cfe->debugfs); in cfe_probe()
2395 cfe_err(cfe, "Failed to init pisp fe (%d)\n", ret); in cfe_probe()
2399 cfe->mdev.hw_revision = cfe->fe.hw_revision; in cfe_probe()
2400 ret = media_device_register(&cfe->mdev); in cfe_probe()
2402 cfe_err(cfe, "Unable to register media-controller device.\n"); in cfe_probe()
2406 ret = cfe_register_async_nf(cfe); in cfe_probe()
2408 cfe_err(cfe, "Failed to connect subdevs\n"); in cfe_probe()
2412 pm_runtime_put(&cfe->pdev->dev); in cfe_probe()
2417 media_device_unregister(&cfe->mdev); in cfe_probe()
2419 pisp_fe_uninit(&cfe->fe); in cfe_probe()
2421 csi2_uninit(&cfe->csi2); in cfe_probe()
2423 pm_runtime_put(&cfe->pdev->dev); in cfe_probe()
2426 debugfs_remove(cfe->debugfs); in cfe_probe()
2427 v4l2_device_unregister(&cfe->v4l2_dev); in cfe_probe()
2429 cfe_put(cfe); in cfe_probe()
2436 struct cfe_device *cfe = platform_get_drvdata(pdev); in cfe_remove() local
2438 debugfs_remove(cfe->debugfs); in cfe_remove()
2440 v4l2_async_nf_unregister(&cfe->notifier); in cfe_remove()
2441 v4l2_async_nf_cleanup(&cfe->notifier); in cfe_remove()
2443 media_device_unregister(&cfe->mdev); in cfe_remove()
2444 cfe_unregister_nodes(cfe); in cfe_remove()
2446 pisp_fe_uninit(&cfe->fe); in cfe_remove()
2447 csi2_uninit(&cfe->csi2); in cfe_remove()
2451 v4l2_device_unregister(&cfe->v4l2_dev); in cfe_remove()
2453 cfe_put(cfe); in cfe_remove()
2459 struct cfe_device *cfe = platform_get_drvdata(pdev); in cfe_runtime_suspend() local
2461 clk_disable_unprepare(cfe->clk); in cfe_runtime_suspend()
2469 struct cfe_device *cfe = platform_get_drvdata(pdev); in cfe_runtime_resume() local
2472 ret = clk_prepare_enable(cfe->clk); in cfe_runtime_resume()
2488 { .compatible = "raspberrypi,rp1-cfe" },