Lines Matching defs:csi2

28 			   struct isp_csi2_device *csi2, u8 enable)
30 struct isp_csi2_ctrl_cfg *currctrl = &csi2->ctrl;
32 isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_CTRL, ISPCSI2_CTRL_IF_EN,
44 struct isp_csi2_device *csi2,
49 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTRL);
74 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTRL);
161 * @csi2: ISP CSI2 device
165 static u16 csi2_ctx_map_format(struct isp_csi2_device *csi2)
167 const struct v4l2_mbus_framefmt *fmt = &csi2->formats[CSI2_PAD_SINK];
192 if (!(csi2->output & CSI2_OUTPUT_CCDC) &&
193 !(csi2->output & CSI2_OUTPUT_MEMORY)) {
201 destidx = csi2->frame_skip ? 0 : !!(csi2->output & CSI2_OUTPUT_CCDC);
202 is_3630 = csi2->isp->revision == ISP_REVISION_15_0;
204 return __csi2_fmt_map[fmtidx][destidx][csi2->dpcm_decompress][is_3630];
209 * @csi2: Pointer to ISP CSI2a device.
217 static void csi2_set_outaddr(struct isp_csi2_device *csi2, u32 addr)
219 struct isp_device *isp = csi2->isp;
220 struct isp_csi2_ctx_cfg *ctx = &csi2->contexts[0];
225 csi2->regs1, ISPCSI2_CTX_DAT_PING_ADDR(ctx->ctxnum));
227 csi2->regs1, ISPCSI2_CTX_DAT_PONG_ADDR(ctx->ctxnum));
248 struct isp_csi2_device *csi2, u8 ctxnum, u8 enable)
250 struct isp_csi2_ctx_cfg *ctx = &csi2->contexts[ctxnum];
254 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL1(ctxnum));
257 if (csi2->frame_skip)
258 skip = csi2->frame_skip;
259 else if (csi2->output & CSI2_OUTPUT_MEMORY)
270 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL1(ctxnum));
280 struct isp_csi2_device *csi2,
286 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL1(ctx->ctxnum));
303 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL1(ctx->ctxnum));
306 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL2(ctx->ctxnum));
326 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL2(ctx->ctxnum));
329 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL3(ctx->ctxnum));
333 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL3(ctx->ctxnum));
336 reg = isp_reg_readl(isp, csi2->regs1,
340 isp_reg_writel(isp, reg, csi2->regs1,
344 csi2->regs1, ISPCSI2_CTX_DAT_PING_ADDR(ctx->ctxnum));
347 csi2->regs1, ISPCSI2_CTX_DAT_PONG_ADDR(ctx->ctxnum));
355 struct isp_csi2_device *csi2,
360 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_TIMING);
381 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_TIMING);
389 struct isp_csi2_device *csi2, int enable)
394 isp_reg_writel(isp, ISPCSI2_CTX_IRQSTATUS_FE_IRQ, csi2->regs1,
397 isp_reg_set(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
400 isp_reg_clr(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
410 struct isp_csi2_device *csi2, int enable)
440 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_PHY_IRQSTATUS);
442 reg |= isp_reg_readl(isp, csi2->regs1, ISPCSI2_PHY_IRQENABLE);
445 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_PHY_IRQENABLE);
453 struct isp_csi2_device *csi2, int enable)
464 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_IRQSTATUS);
466 reg |= isp_reg_readl(isp, csi2->regs1, ISPCSI2_IRQENABLE);
470 isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_IRQENABLE);
480 int omap3isp_csi2_reset(struct isp_csi2_device *csi2)
482 struct isp_device *isp = csi2->isp;
487 if (!csi2->available)
490 if (csi2->phy->entity)
493 isp_reg_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
497 reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_SYSSTATUS) &
512 isp_reg_set(isp, csi2->regs1, ISPCSI2_PHY_CFG,
517 reg = isp_reg_readl(isp, csi2->phy->phy_regs, ISPCSIPHY_REG1)
531 isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
538 isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
546 static int csi2_configure(struct isp_csi2_device *csi2)
548 struct isp_pipeline *pipe = to_isp_pipeline(&csi2->subdev.entity);
550 struct isp_device *isp = csi2->isp;
551 struct isp_csi2_timing_cfg *timing = &csi2->timing[0];
561 if (csi2->contexts[0].enabled || csi2->ctrl.if_enable)
564 pad = media_entity_remote_pad(&csi2->pads[CSI2_PAD_SINK]);
568 csi2->frame_skip = 0;
569 v4l2_subdev_call(sensor, sensor, g_skip_frames, &csi2->frame_skip);
571 csi2->ctrl.vp_out_ctrl =
576 csi2->ctrl.vp_out_ctrl);
577 csi2->ctrl.frame_mode = ISP_CSI2_FRAME_IMMEDIATE;
578 csi2->ctrl.ecc_enable = buscfg->bus.csi2.crc;
591 if (csi2->formats[CSI2_PAD_SINK].code !=
592 csi2->formats[CSI2_PAD_SOURCE].code)
593 csi2->dpcm_decompress = true;
595 csi2->dpcm_decompress = false;
597 csi2->contexts[0].format_id = csi2_ctx_map_format(csi2);
599 if (csi2->video_out.bpl_padding == 0)
600 csi2->contexts[0].data_offset = 0;
602 csi2->contexts[0].data_offset = csi2->video_out.bpl_value;
611 csi2->contexts[0].eof_enabled = 1;
612 csi2->contexts[0].eol_enabled = 1;
614 csi2_irq_complexio1_set(isp, csi2, 1);
615 csi2_irq_ctx_set(isp, csi2, 1);
616 csi2_irq_status_set(isp, csi2, 1);
619 csi2_timing_config(isp, csi2, timing);
620 csi2_recv_config(isp, csi2, &csi2->ctrl);
621 csi2_ctx_config(isp, csi2, &csi2->contexts[0]);
633 static void csi2_print_status(struct isp_csi2_device *csi2)
635 struct isp_device *isp = csi2->isp;
637 if (!csi2->available)
642 CSI2_PRINT_REGISTER(isp, csi2->regs1, SYSCONFIG);
643 CSI2_PRINT_REGISTER(isp, csi2->regs1, SYSSTATUS);
644 CSI2_PRINT_REGISTER(isp, csi2->regs1, IRQENABLE);
645 CSI2_PRINT_REGISTER(isp, csi2->regs1, IRQSTATUS);
646 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTRL);
647 CSI2_PRINT_REGISTER(isp, csi2->regs1, DBG_H);
648 CSI2_PRINT_REGISTER(isp, csi2->regs1, GNQ);
649 CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_CFG);
650 CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_IRQSTATUS);
651 CSI2_PRINT_REGISTER(isp, csi2->regs1, SHORT_PACKET);
652 CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_IRQENABLE);
653 CSI2_PRINT_REGISTER(isp, csi2->regs1, DBG_P);
654 CSI2_PRINT_REGISTER(isp, csi2->regs1, TIMING);
655 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL1(0));
656 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL2(0));
657 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_OFST(0));
658 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_PING_ADDR(0));
659 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_PONG_ADDR(0));
660 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_IRQENABLE(0));
661 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_IRQSTATUS(0));
662 CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL3(0));
675 static void csi2_isr_buffer(struct isp_csi2_device *csi2)
677 struct isp_device *isp = csi2->isp;
680 csi2_ctx_enable(isp, csi2, 0, 0);
682 buffer = omap3isp_video_buffer_next(&csi2->video_out);
691 csi2_set_outaddr(csi2, buffer->dma);
692 csi2_ctx_enable(isp, csi2, 0, 1);
695 static void csi2_isr_ctx(struct isp_csi2_device *csi2,
698 struct isp_device *isp = csi2->isp;
702 status = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
703 isp_reg_writel(isp, status, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
718 if (csi2->frame_skip) {
719 csi2->frame_skip--;
720 if (csi2->frame_skip == 0) {
721 ctx->format_id = csi2_ctx_map_format(csi2);
722 csi2_ctx_config(isp, csi2, ctx);
723 csi2_ctx_enable(isp, csi2, n, 1);
728 if (csi2->output & CSI2_OUTPUT_MEMORY)
729 csi2_isr_buffer(csi2);
735 void omap3isp_csi2_isr(struct isp_csi2_device *csi2)
737 struct isp_pipeline *pipe = to_isp_pipeline(&csi2->subdev.entity);
739 struct isp_device *isp = csi2->isp;
741 if (!csi2->available)
744 csi2_irqstatus = isp_reg_readl(isp, csi2->regs1, ISPCSI2_IRQSTATUS);
745 isp_reg_writel(isp, csi2_irqstatus, csi2->regs1, ISPCSI2_IRQSTATUS);
749 cpxio1_irqstatus = isp_reg_readl(isp, csi2->regs1,
752 csi2->regs1, ISPCSI2_PHY_IRQSTATUS);
778 if (omap3isp_module_sync_is_stopping(&csi2->wait, &csi2->stopping))
783 csi2_isr_ctx(csi2, &csi2->contexts[0]);
801 struct isp_csi2_device *csi2 = &isp->isp_csi2a;
803 csi2_set_outaddr(csi2, buffer->dma);
811 if (csi2->video_out.dmaqueue_flags & ISP_VIDEO_DMAQUEUE_UNDERRUN) {
813 csi2_if_enable(isp, csi2, 1);
814 csi2_ctx_enable(isp, csi2, 0, 1);
815 isp_video_dmaqueue_flags_clr(&csi2->video_out);
830 __csi2_get_format(struct isp_csi2_device *csi2, struct v4l2_subdev_pad_config *cfg,
834 return v4l2_subdev_get_try_format(&csi2->subdev, cfg, pad);
836 return &csi2->formats[pad];
840 csi2_try_format(struct isp_csi2_device *csi2, struct v4l2_subdev_pad_config *cfg,
870 format = __csi2_get_format(csi2, cfg, CSI2_PAD_SINK, which);
899 struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
909 format = __csi2_get_format(csi2, cfg, CSI2_PAD_SINK,
936 struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
945 csi2_try_format(csi2, cfg, fse->pad, &format, fse->which);
955 csi2_try_format(csi2, cfg, fse->pad, &format, fse->which);
972 struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
975 format = __csi2_get_format(csi2, cfg, fmt->pad, fmt->which);
993 struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
996 format = __csi2_get_format(csi2, cfg, fmt->pad, fmt->which);
1000 csi2_try_format(csi2, cfg, fmt->pad, &fmt->format, fmt->which);
1005 format = __csi2_get_format(csi2, cfg, CSI2_PAD_SOURCE,
1008 csi2_try_format(csi2, cfg, CSI2_PAD_SOURCE, format, fmt->which);
1047 struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
1048 struct isp_device *isp = csi2->isp;
1049 struct isp_video *video_out = &csi2->video_out;
1053 if (omap3isp_csiphy_acquire(csi2->phy, &sd->entity) < 0)
1055 if (csi2->output & CSI2_OUTPUT_MEMORY)
1057 csi2_configure(csi2);
1058 csi2_print_status(csi2);
1066 if (csi2->output & CSI2_OUTPUT_MEMORY &&
1070 atomic_set(&csi2->stopping, 0);
1071 csi2_ctx_enable(isp, csi2, 0, 1);
1072 csi2_if_enable(isp, csi2, 1);
1077 if (csi2->state == ISP_PIPELINE_STREAM_STOPPED)
1079 if (omap3isp_module_sync_idle(&sd->entity, &csi2->wait,
1080 &csi2->stopping))
1083 csi2_ctx_enable(isp, csi2, 0, 0);
1084 csi2_if_enable(isp, csi2, 0);
1085 csi2_irq_ctx_set(isp, csi2, 0);
1086 omap3isp_csiphy_release(csi2->phy);
1092 csi2->state = enable;
1137 struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
1138 struct isp_csi2_ctrl_cfg *ctrl = &csi2->ctrl;
1153 if (csi2->output & ~CSI2_OUTPUT_MEMORY)
1155 csi2->output |= CSI2_OUTPUT_MEMORY;
1157 csi2->output &= ~CSI2_OUTPUT_MEMORY;
1163 if (csi2->output & ~CSI2_OUTPUT_CCDC)
1165 csi2->output |= CSI2_OUTPUT_CCDC;
1167 csi2->output &= ~CSI2_OUTPUT_CCDC;
1177 (csi2->output & CSI2_OUTPUT_MEMORY) ? false : true;
1178 ctrl->vp_clk_enable = !!(csi2->output & CSI2_OUTPUT_CCDC);
1189 void omap3isp_csi2_unregister_entities(struct isp_csi2_device *csi2)
1191 v4l2_device_unregister_subdev(&csi2->subdev);
1192 omap3isp_video_unregister(&csi2->video_out);
1195 int omap3isp_csi2_register_entities(struct isp_csi2_device *csi2,
1201 csi2->subdev.dev = vdev->mdev->dev;
1202 ret = v4l2_device_register_subdev(vdev, &csi2->subdev);
1206 ret = omap3isp_video_register(&csi2->video_out, vdev);
1213 omap3isp_csi2_unregister_entities(csi2);
1223 * @csi2: Pointer to csi2 structure.
1226 static int csi2_init_entities(struct isp_csi2_device *csi2)
1228 struct v4l2_subdev *sd = &csi2->subdev;
1229 struct media_pad *pads = csi2->pads;
1238 v4l2_set_subdevdata(sd, csi2);
1253 csi2->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1254 csi2->video_out.ops = &csi2_ispvideo_ops;
1255 csi2->video_out.bpl_alignment = 32;
1256 csi2->video_out.bpl_zero_padding = 1;
1257 csi2->video_out.bpl_max = 0x1ffe0;
1258 csi2->video_out.isp = csi2->isp;
1259 csi2->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3;
1261 ret = omap3isp_video_init(&csi2->video_out, "CSI2a");
1268 media_entity_cleanup(&csi2->subdev.entity);