Lines Matching +full:isp +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-only
5 * TI OMAP3 ISP - CCP2 module
22 #include "isp.h"
29 #define ISPCCP2_DAT_START_MIN 0
31 #define ISPCCP2_DAT_SIZE_MIN 0
34 #define ISPCCP2_LCx_CTRL_FORMAT_RAW8_DPCM10_VP 0x12
35 #define ISPCCP2_LCx_CTRL_FORMAT_RAW10_VP 0x16
39 #define ISPCCP2_LCM_HSIZE_SKIP_MIN 0
46 #define ISPCCP2_LCM_CTRL_READ_THROTTLE_FULL 0
51 #define ISPCCP2_LCM_CTRL_DST_PORT_VP 0
59 } while (0)
62 * ccp2_print_status - Print current CCP2 module register values.
64 #define CCP2_PRINT_REGISTER(isp, name)\ argument
65 dev_dbg(isp->dev, "###CCP2 " #name "=0x%08x\n", \
66 isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_##name))
70 struct isp_device *isp = to_isp_device(ccp2); in ccp2_print_status() local
72 dev_dbg(isp->dev, "-------------CCP2 Register dump-------------\n"); in ccp2_print_status()
74 CCP2_PRINT_REGISTER(isp, SYSCONFIG); in ccp2_print_status()
75 CCP2_PRINT_REGISTER(isp, SYSSTATUS); in ccp2_print_status()
76 CCP2_PRINT_REGISTER(isp, LC01_IRQENABLE); in ccp2_print_status()
77 CCP2_PRINT_REGISTER(isp, LC01_IRQSTATUS); in ccp2_print_status()
78 CCP2_PRINT_REGISTER(isp, LC23_IRQENABLE); in ccp2_print_status()
79 CCP2_PRINT_REGISTER(isp, LC23_IRQSTATUS); in ccp2_print_status()
80 CCP2_PRINT_REGISTER(isp, LCM_IRQENABLE); in ccp2_print_status()
81 CCP2_PRINT_REGISTER(isp, LCM_IRQSTATUS); in ccp2_print_status()
82 CCP2_PRINT_REGISTER(isp, CTRL); in ccp2_print_status()
83 CCP2_PRINT_REGISTER(isp, LCx_CTRL(0)); in ccp2_print_status()
84 CCP2_PRINT_REGISTER(isp, LCx_CODE(0)); in ccp2_print_status()
85 CCP2_PRINT_REGISTER(isp, LCx_STAT_START(0)); in ccp2_print_status()
86 CCP2_PRINT_REGISTER(isp, LCx_STAT_SIZE(0)); in ccp2_print_status()
87 CCP2_PRINT_REGISTER(isp, LCx_SOF_ADDR(0)); in ccp2_print_status()
88 CCP2_PRINT_REGISTER(isp, LCx_EOF_ADDR(0)); in ccp2_print_status()
89 CCP2_PRINT_REGISTER(isp, LCx_DAT_START(0)); in ccp2_print_status()
90 CCP2_PRINT_REGISTER(isp, LCx_DAT_SIZE(0)); in ccp2_print_status()
91 CCP2_PRINT_REGISTER(isp, LCx_DAT_PING_ADDR(0)); in ccp2_print_status()
92 CCP2_PRINT_REGISTER(isp, LCx_DAT_PONG_ADDR(0)); in ccp2_print_status()
93 CCP2_PRINT_REGISTER(isp, LCx_DAT_OFST(0)); in ccp2_print_status()
94 CCP2_PRINT_REGISTER(isp, LCM_CTRL); in ccp2_print_status()
95 CCP2_PRINT_REGISTER(isp, LCM_VSIZE); in ccp2_print_status()
96 CCP2_PRINT_REGISTER(isp, LCM_HSIZE); in ccp2_print_status()
97 CCP2_PRINT_REGISTER(isp, LCM_PREFETCH); in ccp2_print_status()
98 CCP2_PRINT_REGISTER(isp, LCM_SRC_ADDR); in ccp2_print_status()
99 CCP2_PRINT_REGISTER(isp, LCM_SRC_OFST); in ccp2_print_status()
100 CCP2_PRINT_REGISTER(isp, LCM_DST_ADDR); in ccp2_print_status()
101 CCP2_PRINT_REGISTER(isp, LCM_DST_OFST); in ccp2_print_status()
103 dev_dbg(isp->dev, "--------------------------------------------\n"); in ccp2_print_status()
107 * ccp2_reset - Reset the CCP2
108 * @ccp2: pointer to ISP CCP2 device
112 struct isp_device *isp = to_isp_device(ccp2); in ccp2_reset() local
113 int i = 0; in ccp2_reset()
116 isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_SYSCONFIG, in ccp2_reset()
118 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_SYSSTATUS) & in ccp2_reset()
122 dev_warn(isp->dev, in ccp2_reset()
130 * ccp2_pwr_cfg - Configure the power mode settings
131 * @ccp2: pointer to ISP CCP2 device
135 struct isp_device *isp = to_isp_device(ccp2); in ccp2_pwr_cfg() local
137 isp_reg_writel(isp, ISPCCP2_SYSCONFIG_MSTANDBY_MODE_SMART | in ccp2_pwr_cfg()
138 ((isp->revision == ISP_REVISION_15_0 && isp->autoidle) ? in ccp2_pwr_cfg()
139 ISPCCP2_SYSCONFIG_AUTO_IDLE : 0), in ccp2_pwr_cfg()
144 * ccp2_if_enable - Enable CCP2 interface.
145 * @ccp2: pointer to ISP CCP2 device
150 struct isp_device *isp = to_isp_device(ccp2); in ccp2_if_enable() local
154 if (enable && ccp2->vdds_csib) { in ccp2_if_enable()
155 ret = regulator_enable(ccp2->vdds_csib); in ccp2_if_enable()
156 if (ret < 0) in ccp2_if_enable()
161 for (i = 0; i < CCP2_LCx_CHANS_NUM; i++) in ccp2_if_enable()
162 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCx_CTRL(i), in ccp2_if_enable()
164 enable ? ISPCCP2_LCx_CTRL_CHAN_EN : 0); in ccp2_if_enable()
167 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL, in ccp2_if_enable()
169 enable ? (ISPCCP2_CTRL_MODE | ISPCCP2_CTRL_IF_EN) : 0); in ccp2_if_enable()
171 if (!enable && ccp2->vdds_csib) in ccp2_if_enable()
172 regulator_disable(ccp2->vdds_csib); in ccp2_if_enable()
174 return 0; in ccp2_if_enable()
178 * ccp2_mem_enable - Enable CCP2 memory interface.
179 * @ccp2: pointer to ISP CCP2 device
184 struct isp_device *isp = to_isp_device(ccp2); in ccp2_mem_enable() local
187 ccp2_if_enable(ccp2, 0); in ccp2_mem_enable()
190 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL, in ccp2_mem_enable()
191 ISPCCP2_CTRL_MODE, enable ? ISPCCP2_CTRL_MODE : 0); in ccp2_mem_enable()
193 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCM_CTRL, in ccp2_mem_enable()
195 enable ? ISPCCP2_LCM_CTRL_CHAN_EN : 0); in ccp2_mem_enable()
199 * ccp2_phyif_config - Initialize CCP2 phy interface config
200 * @ccp2: Pointer to ISP CCP2 device
205 * Returns -EIO if strobe is chosen in CSI1 mode, or 0 on success.
210 struct isp_device *isp = to_isp_device(ccp2); in ccp2_phyif_config() local
213 val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL) | in ccp2_phyif_config()
217 buscfg->phy_layer); in ccp2_phyif_config()
219 ISPCCP2_CTRL_IO_OUT_SEL_MASK, buscfg->ccp2_mode); in ccp2_phyif_config()
221 buscfg->strobe_clk_pol); in ccp2_phyif_config()
223 ISPCCP2_CTRL_VP_CLK_POL_MASK, buscfg->vp_clk_pol); in ccp2_phyif_config()
224 isp_reg_writel(isp, val, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL); in ccp2_phyif_config()
226 val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL); in ccp2_phyif_config()
228 if (buscfg->ccp2_mode == ISP_CCP2_MODE_CCP2) in ccp2_phyif_config()
229 dev_warn(isp->dev, "OMAP3 CCP2 bus not available\n"); in ccp2_phyif_config()
230 if (buscfg->phy_layer == ISP_CCP2_PHY_DATA_STROBE) in ccp2_phyif_config()
232 return -EIO; in ccp2_phyif_config()
235 return 0; in ccp2_phyif_config()
239 * ccp2_vp_config - Initialize CCP2 video port interface.
240 * @ccp2: Pointer to ISP CCP2 device
244 * values depend on the ISP revision:
246 * - revision 1.0 and 2.0 1 to 4
247 * - revision 15.0 1 to 65536
249 * The exact divisor value used might differ from the requested value, as ISP
255 struct isp_device *isp = to_isp_device(ccp2); in ccp2_vp_config() local
259 val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL); in ccp2_vp_config()
262 if (isp->revision == ISP_REVISION_15_0) { in ccp2_vp_config()
270 ISPCCP2_CTRL_VP_OUT_CTRL_MASK, vpclk_div - 1); in ccp2_vp_config()
273 isp_reg_writel(isp, val, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL); in ccp2_vp_config()
277 * ccp2_lcx_config - Initialize CCP2 logical channel interface.
278 * @ccp2: Pointer to ISP CCP2 device
279 * @config: Pointer to ISP LCx config structure.
288 struct isp_device *isp = to_isp_device(ccp2); in ccp2_lcx_config() local
291 switch (config->format) { in ccp2_lcx_config()
300 /* ISPCCP2_LCx_CTRL logical channel #0 */ in ccp2_lcx_config()
301 val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCx_CTRL(0)) in ccp2_lcx_config()
304 if (isp->revision == ISP_REVISION_15_0) { in ccp2_lcx_config()
308 config->crc); in ccp2_lcx_config()
315 config->crc); in ccp2_lcx_config()
320 isp_reg_writel(isp, val, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCx_CTRL(0)); in ccp2_lcx_config()
322 /* ISPCCP2_DAT_START for logical channel #0 */ in ccp2_lcx_config()
323 isp_reg_writel(isp, config->data_start << ISPCCP2_LCx_DAT_SHIFT, in ccp2_lcx_config()
324 OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCx_DAT_START(0)); in ccp2_lcx_config()
326 /* ISPCCP2_DAT_SIZE for logical channel #0 */ in ccp2_lcx_config()
327 isp_reg_writel(isp, config->data_size << ISPCCP2_LCx_DAT_SHIFT, in ccp2_lcx_config()
328 OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCx_DAT_SIZE(0)); in ccp2_lcx_config()
330 /* Enable error IRQs for logical channel #0 */ in ccp2_lcx_config()
338 isp_reg_writel(isp, val, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LC01_IRQSTATUS); in ccp2_lcx_config()
339 isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LC01_IRQENABLE, val); in ccp2_lcx_config()
343 * ccp2_if_configure - Configure ccp2 with data from sensor
344 * @ccp2: Pointer to ISP CCP2 device
346 * Return 0 on success or a negative error code
350 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in ccp2_if_configure()
355 u32 lines = 0; in ccp2_if_configure()
360 pad = media_pad_remote_pad_first(&ccp2->pads[CCP2_PAD_SINK]); in ccp2_if_configure()
361 sensor = media_entity_to_v4l2_subdev(pad->entity); in ccp2_if_configure()
362 buscfg = v4l2_subdev_to_bus_cfg(pipe->external); in ccp2_if_configure()
364 return -EPIPE; in ccp2_if_configure()
366 ret = ccp2_phyif_config(ccp2, &buscfg->bus.ccp2); in ccp2_if_configure()
367 if (ret < 0) in ccp2_if_configure()
370 ccp2_vp_config(ccp2, buscfg->bus.ccp2.vpclk_div + 1); in ccp2_if_configure()
374 format = &ccp2->formats[CCP2_PAD_SINK]; in ccp2_if_configure()
376 ccp2->if_cfg.data_start = lines; in ccp2_if_configure()
377 ccp2->if_cfg.crc = buscfg->bus.ccp2.crc; in ccp2_if_configure()
378 ccp2->if_cfg.format = format->code; in ccp2_if_configure()
379 ccp2->if_cfg.data_size = format->height; in ccp2_if_configure()
381 ccp2_lcx_config(ccp2, &ccp2->if_cfg); in ccp2_if_configure()
383 return 0; in ccp2_if_configure()
388 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in ccp2_adjust_bandwidth()
389 struct isp_device *isp = to_isp_device(ccp2); in ccp2_adjust_bandwidth() local
390 const struct v4l2_mbus_framefmt *ofmt = &ccp2->formats[CCP2_PAD_SOURCE]; in ccp2_adjust_bandwidth()
391 unsigned long l3_ick = pipe->l3_ick; in ccp2_adjust_bandwidth()
402 vpclk_div = max_t(unsigned int, DIV_ROUND_UP(l3_ick, pipe->max_rate), in ccp2_adjust_bandwidth()
409 timeperframe = &pipe->max_timeperframe; in ccp2_adjust_bandwidth()
411 if (timeperframe->numerator) { in ccp2_adjust_bandwidth()
412 area = ofmt->width * ofmt->height; in ccp2_adjust_bandwidth()
413 bound = div_u64(area * timeperframe->denominator, in ccp2_adjust_bandwidth()
414 timeperframe->numerator); in ccp2_adjust_bandwidth()
419 dev_dbg(isp->dev, "%s: minimum clock divisor = %u\n", __func__, in ccp2_adjust_bandwidth()
426 * ccp2_mem_configure - Initialize CCP2 memory input/output interface
427 * @ccp2: Pointer to ISP CCP2 device
428 * @config: Pointer to ISP mem interface config structure
437 struct isp_device *isp = to_isp_device(ccp2); in ccp2_mem_configure() local
438 u32 sink_pixcode = ccp2->formats[CCP2_PAD_SINK].code; in ccp2_mem_configure()
439 u32 source_pixcode = ccp2->formats[CCP2_PAD_SOURCE].code; in ccp2_mem_configure()
440 unsigned int dpcm_decompress = 0; in ccp2_mem_configure()
450 isp_reg_writel(isp, ISPCCP2_LCM_HSIZE_SKIP_MIN | in ccp2_mem_configure()
451 (config->hsize_count << ISPCCP2_LCM_HSIZE_SHIFT), in ccp2_mem_configure()
455 isp_reg_writel(isp, config->vsize_count << ISPCCP2_LCM_VSIZE_SHIFT, in ccp2_mem_configure()
458 if (ccp2->video_in.bpl_padding == 0) in ccp2_mem_configure()
459 config->src_ofst = 0; in ccp2_mem_configure()
461 config->src_ofst = ccp2->video_in.bpl_value; in ccp2_mem_configure()
463 isp_reg_writel(isp, config->src_ofst, OMAP3_ISP_IOMEM_CCP2, in ccp2_mem_configure()
475 /* RAW8 + DPCM10 - simple predictor */ in ccp2_mem_configure()
491 isp_reg_writel(isp, val, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCM_CTRL); in ccp2_mem_configure()
496 config->hsize_count) >> 3; in ccp2_mem_configure()
499 config->hsize_count) >> 2; in ccp2_mem_configure()
501 isp_reg_writel(isp, hwords << ISPCCP2_LCM_PREFETCH_SHIFT, in ccp2_mem_configure()
505 isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL, in ccp2_mem_configure()
510 isp_reg_writel(isp, ISPCCP2_LCM_IRQSTATUS_OCPERROR_IRQ | in ccp2_mem_configure()
515 isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCM_IRQENABLE, in ccp2_mem_configure()
521 * ccp2_set_inaddr - Sets memory address of input frame.
522 * @ccp2: Pointer to ISP CCP2 device
529 struct isp_device *isp = to_isp_device(ccp2); in ccp2_set_inaddr() local
531 isp_reg_writel(isp, addr, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCM_SRC_ADDR); in ccp2_set_inaddr()
534 /* -----------------------------------------------------------------------------
540 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in ccp2_isr_buffer()
543 buffer = omap3isp_video_buffer_next(&ccp2->video_in); in ccp2_isr_buffer()
545 ccp2_set_inaddr(ccp2, buffer->dma); in ccp2_isr_buffer()
547 pipe->state |= ISP_PIPELINE_IDLE_INPUT; in ccp2_isr_buffer()
549 if (ccp2->state == ISP_PIPELINE_STREAM_SINGLESHOT) { in ccp2_isr_buffer()
557 * omap3isp_ccp2_isr - Handle ISP CCP2 interrupts
558 * @ccp2: Pointer to ISP CCP2 device
564 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in omap3isp_ccp2_isr()
565 struct isp_device *isp = to_isp_device(ccp2); in omap3isp_ccp2_isr() local
576 lcx_irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, in omap3isp_ccp2_isr()
578 isp_reg_writel(isp, lcx_irqstatus, OMAP3_ISP_IOMEM_CCP2, in omap3isp_ccp2_isr()
581 lcm_irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, in omap3isp_ccp2_isr()
583 isp_reg_writel(isp, lcm_irqstatus, OMAP3_ISP_IOMEM_CCP2, in omap3isp_ccp2_isr()
587 pipe->error = true; in omap3isp_ccp2_isr()
588 dev_dbg(isp->dev, "CCP2 err:%x\n", lcx_irqstatus); in omap3isp_ccp2_isr()
593 pipe->error = true; in omap3isp_ccp2_isr()
594 dev_dbg(isp->dev, "CCP2 OCP err:%x\n", lcm_irqstatus); in omap3isp_ccp2_isr()
597 if (omap3isp_module_sync_is_stopping(&ccp2->wait, &ccp2->stopping)) in omap3isp_ccp2_isr()
605 /* -----------------------------------------------------------------------------
615 * __ccp2_get_format - helper function for getting ccp2 format
616 * @ccp2 : Pointer to ISP CCP2 device
630 return &ccp2->formats[pad]; in __ccp2_get_format()
634 * ccp2_try_format - Handle try format by pad subdev method
635 * @ccp2 : Pointer to ISP CCP2 device
651 if (fmt->code != MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8) in ccp2_try_format()
652 fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10; in ccp2_try_format()
654 if (ccp2->input == CCP2_INPUT_SENSOR) { in ccp2_try_format()
655 fmt->width = clamp_t(u32, fmt->width, in ccp2_try_format()
658 fmt->height = clamp_t(u32, fmt->height, in ccp2_try_format()
661 } else if (ccp2->input == CCP2_INPUT_MEMORY) { in ccp2_try_format()
662 fmt->width = clamp_t(u32, fmt->width, in ccp2_try_format()
665 fmt->height = clamp_t(u32, fmt->height, in ccp2_try_format()
672 /* Source format - copy sink format and change pixel code in ccp2_try_format()
680 fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10; in ccp2_try_format()
684 fmt->field = V4L2_FIELD_NONE; in ccp2_try_format()
685 fmt->colorspace = V4L2_COLORSPACE_SRGB; in ccp2_try_format()
689 * ccp2_enum_mbus_code - Handle pixel format enumeration
693 * return -EINVAL or zero on success
702 if (code->pad == CCP2_PAD_SINK) { in ccp2_enum_mbus_code()
703 if (code->index >= ARRAY_SIZE(ccp2_fmts)) in ccp2_enum_mbus_code()
704 return -EINVAL; in ccp2_enum_mbus_code()
706 code->code = ccp2_fmts[code->index]; in ccp2_enum_mbus_code()
708 if (code->index != 0) in ccp2_enum_mbus_code()
709 return -EINVAL; in ccp2_enum_mbus_code()
712 code->which); in ccp2_enum_mbus_code()
713 code->code = format->code; in ccp2_enum_mbus_code()
716 return 0; in ccp2_enum_mbus_code()
726 if (fse->index != 0) in ccp2_enum_frame_size()
727 return -EINVAL; in ccp2_enum_frame_size()
729 format.code = fse->code; in ccp2_enum_frame_size()
732 ccp2_try_format(ccp2, sd_state, fse->pad, &format, fse->which); in ccp2_enum_frame_size()
733 fse->min_width = format.width; in ccp2_enum_frame_size()
734 fse->min_height = format.height; in ccp2_enum_frame_size()
736 if (format.code != fse->code) in ccp2_enum_frame_size()
737 return -EINVAL; in ccp2_enum_frame_size()
739 format.code = fse->code; in ccp2_enum_frame_size()
740 format.width = -1; in ccp2_enum_frame_size()
741 format.height = -1; in ccp2_enum_frame_size()
742 ccp2_try_format(ccp2, sd_state, fse->pad, &format, fse->which); in ccp2_enum_frame_size()
743 fse->max_width = format.width; in ccp2_enum_frame_size()
744 fse->max_height = format.height; in ccp2_enum_frame_size()
746 return 0; in ccp2_enum_frame_size()
750 * ccp2_get_format - Handle get format by pads subdev method
754 * return -EINVAL or zero on success
763 format = __ccp2_get_format(ccp2, sd_state, fmt->pad, fmt->which); in ccp2_get_format()
765 return -EINVAL; in ccp2_get_format()
767 fmt->format = *format; in ccp2_get_format()
768 return 0; in ccp2_get_format()
772 * ccp2_set_format - Handle set format by pads subdev method
785 format = __ccp2_get_format(ccp2, sd_state, fmt->pad, fmt->which); in ccp2_set_format()
787 return -EINVAL; in ccp2_set_format()
789 ccp2_try_format(ccp2, sd_state, fmt->pad, &fmt->format, fmt->which); in ccp2_set_format()
790 *format = fmt->format; in ccp2_set_format()
793 if (fmt->pad == CCP2_PAD_SINK) { in ccp2_set_format()
795 fmt->which); in ccp2_set_format()
796 *format = fmt->format; in ccp2_set_format()
798 fmt->which); in ccp2_set_format()
801 return 0; in ccp2_set_format()
805 * ccp2_init_formats - Initialize formats on all pads
806 * @sd: ISP CCP2 V4L2 subdevice
817 memset(&format, 0, sizeof(format)); in ccp2_init_formats()
823 ccp2_set_format(sd, fh ? fh->state : NULL, &format); in ccp2_init_formats()
825 return 0; in ccp2_init_formats()
829 * ccp2_s_stream - Enable/Disable streaming on ccp2 subdev
831 * @enable: 1 == Enable, 0 == Disable
837 struct isp_device *isp = to_isp_device(ccp2); in ccp2_s_stream() local
841 if (ccp2->state == ISP_PIPELINE_STREAM_STOPPED) { in ccp2_s_stream()
843 return 0; in ccp2_s_stream()
844 atomic_set(&ccp2->stopping, 0); in ccp2_s_stream()
849 if (ccp2->phy) { in ccp2_s_stream()
850 ret = omap3isp_csiphy_acquire(ccp2->phy, &sd->entity); in ccp2_s_stream()
851 if (ret < 0) in ccp2_s_stream()
860 if (ret < 0) { in ccp2_s_stream()
861 if (ccp2->phy) in ccp2_s_stream()
862 omap3isp_csiphy_release(ccp2->phy); in ccp2_s_stream()
868 if (ccp2->state != ISP_PIPELINE_STREAM_SINGLESHOT) { in ccp2_s_stream()
871 format = &ccp2->formats[CCP2_PAD_SINK]; in ccp2_s_stream()
873 ccp2->mem_cfg.hsize_count = format->width; in ccp2_s_stream()
874 ccp2->mem_cfg.vsize_count = format->height; in ccp2_s_stream()
875 ccp2->mem_cfg.src_ofst = 0; in ccp2_s_stream()
877 ccp2_mem_configure(ccp2, &ccp2->mem_cfg); in ccp2_s_stream()
878 omap3isp_sbl_enable(isp, OMAP3_ISP_SBL_CSI1_READ); in ccp2_s_stream()
885 if (omap3isp_module_sync_idle(&sd->entity, &ccp2->wait, in ccp2_s_stream()
886 &ccp2->stopping)) in ccp2_s_stream()
887 dev_dbg(dev, "%s: module stop timeout.\n", sd->name); in ccp2_s_stream()
888 if (ccp2->input == CCP2_INPUT_MEMORY) { in ccp2_s_stream()
889 ccp2_mem_enable(ccp2, 0); in ccp2_s_stream()
890 omap3isp_sbl_disable(isp, OMAP3_ISP_SBL_CSI1_READ); in ccp2_s_stream()
891 } else if (ccp2->input == CCP2_INPUT_SENSOR) { in ccp2_s_stream()
893 ccp2_if_enable(ccp2, 0); in ccp2_s_stream()
894 if (ccp2->phy) in ccp2_s_stream()
895 omap3isp_csiphy_release(ccp2->phy); in ccp2_s_stream()
900 ccp2->state = enable; in ccp2_s_stream()
901 return 0; in ccp2_s_stream()
928 /* --------------------------------------------------------------------------
929 * ISP ccp2 video device node
933 * ccp2_video_queue - Queue video buffer.
934 * @video : Pointer to isp video structure
936 * return -EIO or zero on success
940 struct isp_ccp2_device *ccp2 = &video->isp->isp_ccp2; in ccp2_video_queue()
942 ccp2_set_inaddr(ccp2, buffer->dma); in ccp2_video_queue()
943 return 0; in ccp2_video_queue()
950 /* -----------------------------------------------------------------------------
955 * ccp2_link_setup - Setup ccp2 connections.
960 * return -EINVAL on error or zero on success
968 unsigned int index = local->index; in ccp2_link_setup()
971 if (is_media_entity_v4l2_subdev(remote->entity)) in ccp2_link_setup()
978 if (ccp2->input == CCP2_INPUT_SENSOR) in ccp2_link_setup()
979 return -EBUSY; in ccp2_link_setup()
980 ccp2->input = CCP2_INPUT_MEMORY; in ccp2_link_setup()
982 if (ccp2->input == CCP2_INPUT_MEMORY) in ccp2_link_setup()
983 ccp2->input = CCP2_INPUT_NONE; in ccp2_link_setup()
990 if (ccp2->input == CCP2_INPUT_MEMORY) in ccp2_link_setup()
991 return -EBUSY; in ccp2_link_setup()
992 ccp2->input = CCP2_INPUT_SENSOR; in ccp2_link_setup()
994 if (ccp2->input == CCP2_INPUT_SENSOR) in ccp2_link_setup()
995 ccp2->input = CCP2_INPUT_NONE; in ccp2_link_setup()
1001 ccp2->output = CCP2_OUTPUT_CCDC; in ccp2_link_setup()
1003 ccp2->output = CCP2_OUTPUT_NONE; in ccp2_link_setup()
1007 return -EINVAL; in ccp2_link_setup()
1010 return 0; in ccp2_link_setup()
1020 * omap3isp_ccp2_unregister_entities - Unregister media entities: subdev
1021 * @ccp2: Pointer to ISP CCP2 device
1025 v4l2_device_unregister_subdev(&ccp2->subdev); in omap3isp_ccp2_unregister_entities()
1026 omap3isp_video_unregister(&ccp2->video_in); in omap3isp_ccp2_unregister_entities()
1030 * omap3isp_ccp2_register_entities - Register the subdev media entity
1031 * @ccp2: Pointer to ISP CCP2 device
1042 ccp2->subdev.dev = vdev->mdev->dev; in omap3isp_ccp2_register_entities()
1043 ret = v4l2_device_register_subdev(vdev, &ccp2->subdev); in omap3isp_ccp2_register_entities()
1044 if (ret < 0) in omap3isp_ccp2_register_entities()
1047 ret = omap3isp_video_register(&ccp2->video_in, vdev); in omap3isp_ccp2_register_entities()
1048 if (ret < 0) in omap3isp_ccp2_register_entities()
1051 return 0; in omap3isp_ccp2_register_entities()
1058 /* -----------------------------------------------------------------------------
1059 * ISP ccp2 initialisation and cleanup
1063 * ccp2_init_entities - Initialize ccp2 subdev and media entity.
1064 * @ccp2: Pointer to ISP CCP2 device
1069 struct v4l2_subdev *sd = &ccp2->subdev; in ccp2_init_entities()
1070 struct media_pad *pads = ccp2->pads; in ccp2_init_entities()
1071 struct media_entity *me = &sd->entity; in ccp2_init_entities()
1074 ccp2->input = CCP2_INPUT_NONE; in ccp2_init_entities()
1075 ccp2->output = CCP2_OUTPUT_NONE; in ccp2_init_entities()
1078 sd->internal_ops = &ccp2_sd_internal_ops; in ccp2_init_entities()
1079 strscpy(sd->name, "OMAP3 ISP CCP2", sizeof(sd->name)); in ccp2_init_entities()
1080 sd->grp_id = 1 << 16; /* group ID for isp subdevs */ in ccp2_init_entities()
1082 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ccp2_init_entities()
1088 me->ops = &ccp2_media_ops; in ccp2_init_entities()
1090 if (ret < 0) in ccp2_init_entities()
1106 ccp2->video_in.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in ccp2_init_entities()
1107 ccp2->video_in.bpl_alignment = 32; in ccp2_init_entities()
1108 ccp2->video_in.bpl_max = 0xffffffe0; in ccp2_init_entities()
1109 ccp2->video_in.isp = to_isp_device(ccp2); in ccp2_init_entities()
1110 ccp2->video_in.ops = &ccp2_video_ops; in ccp2_init_entities()
1111 ccp2->video_in.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; in ccp2_init_entities()
1113 ret = omap3isp_video_init(&ccp2->video_in, "CCP2"); in ccp2_init_entities()
1114 if (ret < 0) in ccp2_init_entities()
1117 return 0; in ccp2_init_entities()
1120 media_entity_cleanup(&ccp2->subdev.entity); in ccp2_init_entities()
1125 * omap3isp_ccp2_init - CCP2 initialization.
1126 * @isp : Pointer to ISP device
1129 int omap3isp_ccp2_init(struct isp_device *isp) in omap3isp_ccp2_init() argument
1131 struct isp_ccp2_device *ccp2 = &isp->isp_ccp2; in omap3isp_ccp2_init()
1134 init_waitqueue_head(&ccp2->wait); in omap3isp_ccp2_init()
1147 if (isp->revision == ISP_REVISION_2_0) { in omap3isp_ccp2_init()
1148 ccp2->vdds_csib = devm_regulator_get(isp->dev, "vdds_csib"); in omap3isp_ccp2_init()
1149 if (IS_ERR(ccp2->vdds_csib)) { in omap3isp_ccp2_init()
1150 if (PTR_ERR(ccp2->vdds_csib) == -EPROBE_DEFER) { in omap3isp_ccp2_init()
1151 dev_dbg(isp->dev, in omap3isp_ccp2_init()
1153 return -EPROBE_DEFER; in omap3isp_ccp2_init()
1155 dev_dbg(isp->dev, in omap3isp_ccp2_init()
1157 ccp2->vdds_csib = NULL; in omap3isp_ccp2_init()
1159 ccp2->phy = &isp->isp_csiphy2; in omap3isp_ccp2_init()
1160 } else if (isp->revision == ISP_REVISION_15_0) { in omap3isp_ccp2_init()
1161 ccp2->phy = &isp->isp_csiphy1; in omap3isp_ccp2_init()
1165 if (ret < 0) in omap3isp_ccp2_init()
1169 return 0; in omap3isp_ccp2_init()
1173 * omap3isp_ccp2_cleanup - CCP2 un-initialization
1174 * @isp : Pointer to ISP device
1176 void omap3isp_ccp2_cleanup(struct isp_device *isp) in omap3isp_ccp2_cleanup() argument
1178 struct isp_ccp2_device *ccp2 = &isp->isp_ccp2; in omap3isp_ccp2_cleanup()
1180 omap3isp_video_cleanup(&ccp2->video_in); in omap3isp_ccp2_cleanup()
1181 media_entity_cleanup(&ccp2->subdev.entity); in omap3isp_ccp2_cleanup()