• Home
  • Raw
  • Download

Lines Matching full:ccp2

4  * TI OMAP3 ISP - CCP2 module
31 /* Max/Min size for CCP2 video port */
39 /* Max/Min size for CCP2 memory channel */
65 * ccp2_print_status - Print current CCP2 module register values.
68 dev_dbg(isp->dev, "###CCP2 " #name "=0x%08x\n", \
71 static void ccp2_print_status(struct isp_ccp2_device *ccp2) in ccp2_print_status() argument
73 struct isp_device *isp = to_isp_device(ccp2); in ccp2_print_status()
75 dev_dbg(isp->dev, "-------------CCP2 Register dump-------------\n"); in ccp2_print_status()
110 * ccp2_reset - Reset the CCP2
111 * @ccp2: pointer to ISP CCP2 device
113 static void ccp2_reset(struct isp_ccp2_device *ccp2) in ccp2_reset() argument
115 struct isp_device *isp = to_isp_device(ccp2); in ccp2_reset()
126 "omap3_isp: timeout waiting for ccp2 reset\n"); in ccp2_reset()
134 * @ccp2: pointer to ISP CCP2 device
136 static void ccp2_pwr_cfg(struct isp_ccp2_device *ccp2) in ccp2_pwr_cfg() argument
138 struct isp_device *isp = to_isp_device(ccp2); in ccp2_pwr_cfg()
147 * ccp2_if_enable - Enable CCP2 interface.
148 * @ccp2: pointer to ISP CCP2 device
151 static int ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable) in ccp2_if_enable() argument
153 struct isp_device *isp = to_isp_device(ccp2); in ccp2_if_enable()
157 if (enable && ccp2->vdds_csib) { in ccp2_if_enable()
158 ret = regulator_enable(ccp2->vdds_csib); in ccp2_if_enable()
169 /* Enable/Disable ccp2 interface in ccp2 mode */ in ccp2_if_enable()
174 if (!enable && ccp2->vdds_csib) in ccp2_if_enable()
175 regulator_disable(ccp2->vdds_csib); in ccp2_if_enable()
181 * ccp2_mem_enable - Enable CCP2 memory interface.
182 * @ccp2: pointer to ISP CCP2 device
185 static void ccp2_mem_enable(struct isp_ccp2_device *ccp2, u8 enable) in ccp2_mem_enable() argument
187 struct isp_device *isp = to_isp_device(ccp2); in ccp2_mem_enable()
190 ccp2_if_enable(ccp2, 0); in ccp2_mem_enable()
192 /* Enable/Disable ccp2 interface in ccp2 mode */ in ccp2_mem_enable()
202 * ccp2_phyif_config - Initialize CCP2 phy interface config
203 * @ccp2: Pointer to ISP CCP2 device
204 * @buscfg: CCP2 platform data
206 * Configure the CCP2 physical interface module from platform data.
210 static int ccp2_phyif_config(struct isp_ccp2_device *ccp2, in ccp2_phyif_config() argument
213 struct isp_device *isp = to_isp_device(ccp2); in ccp2_phyif_config()
232 dev_warn(isp->dev, "OMAP3 CCP2 bus not available\n"); in ccp2_phyif_config()
234 /* Strobe mode requires CCP2 */ in ccp2_phyif_config()
242 * ccp2_vp_config - Initialize CCP2 video port interface.
243 * @ccp2: Pointer to ISP CCP2 device
246 * Configure the CCP2 video port with the given clock divisor. The valid divisor
255 static void ccp2_vp_config(struct isp_ccp2_device *ccp2, in ccp2_vp_config() argument
258 struct isp_device *isp = to_isp_device(ccp2); in ccp2_vp_config()
280 * ccp2_lcx_config - Initialize CCP2 logical channel interface.
281 * @ccp2: Pointer to ISP CCP2 device
285 * and configure CSI1/CCP2 logical channel
288 static void ccp2_lcx_config(struct isp_ccp2_device *ccp2, in ccp2_lcx_config() argument
291 struct isp_device *isp = to_isp_device(ccp2); in ccp2_lcx_config()
346 * ccp2_if_configure - Configure ccp2 with data from sensor
347 * @ccp2: Pointer to ISP CCP2 device
351 static int ccp2_if_configure(struct isp_ccp2_device *ccp2) in ccp2_if_configure() argument
353 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in ccp2_if_configure()
361 ccp2_pwr_cfg(ccp2); in ccp2_if_configure()
363 pad = media_entity_remote_pad(&ccp2->pads[CCP2_PAD_SINK]); in ccp2_if_configure()
367 ret = ccp2_phyif_config(ccp2, &buscfg->bus.ccp2); in ccp2_if_configure()
371 ccp2_vp_config(ccp2, buscfg->bus.ccp2.vpclk_div + 1); in ccp2_if_configure()
375 format = &ccp2->formats[CCP2_PAD_SINK]; in ccp2_if_configure()
377 ccp2->if_cfg.data_start = lines; in ccp2_if_configure()
378 ccp2->if_cfg.crc = buscfg->bus.ccp2.crc; in ccp2_if_configure()
379 ccp2->if_cfg.format = format->code; in ccp2_if_configure()
380 ccp2->if_cfg.data_size = format->height; in ccp2_if_configure()
382 ccp2_lcx_config(ccp2, &ccp2->if_cfg); in ccp2_if_configure()
387 static int ccp2_adjust_bandwidth(struct isp_ccp2_device *ccp2) in ccp2_adjust_bandwidth() argument
389 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in ccp2_adjust_bandwidth()
390 struct isp_device *isp = to_isp_device(ccp2); in ccp2_adjust_bandwidth()
391 const struct v4l2_mbus_framefmt *ofmt = &ccp2->formats[CCP2_PAD_SOURCE]; in ccp2_adjust_bandwidth()
427 * ccp2_mem_configure - Initialize CCP2 memory input/output interface
428 * @ccp2: Pointer to ISP CCP2 device
433 * CSI1/CCP2 memory input.
435 static void ccp2_mem_configure(struct isp_ccp2_device *ccp2, in ccp2_mem_configure() argument
438 struct isp_device *isp = to_isp_device(ccp2); in ccp2_mem_configure()
439 u32 sink_pixcode = ccp2->formats[CCP2_PAD_SINK].code; in ccp2_mem_configure()
440 u32 source_pixcode = ccp2->formats[CCP2_PAD_SOURCE].code; in ccp2_mem_configure()
448 ccp2_pwr_cfg(ccp2); in ccp2_mem_configure()
459 if (ccp2->video_in.bpl_padding == 0) in ccp2_mem_configure()
462 config->src_ofst = ccp2->video_in.bpl_value; in ccp2_mem_configure()
508 ccp2_vp_config(ccp2, ccp2_adjust_bandwidth(ccp2)); in ccp2_mem_configure()
523 * @ccp2: Pointer to ISP CCP2 device
528 static void ccp2_set_inaddr(struct isp_ccp2_device *ccp2, u32 addr) in ccp2_set_inaddr() argument
530 struct isp_device *isp = to_isp_device(ccp2); in ccp2_set_inaddr()
539 static void ccp2_isr_buffer(struct isp_ccp2_device *ccp2) in ccp2_isr_buffer() argument
541 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in ccp2_isr_buffer()
544 buffer = omap3isp_video_buffer_next(&ccp2->video_in); in ccp2_isr_buffer()
546 ccp2_set_inaddr(ccp2, buffer->dma); in ccp2_isr_buffer()
550 if (ccp2->state == ISP_PIPELINE_STREAM_SINGLESHOT) { in ccp2_isr_buffer()
558 * omap3isp_ccp2_isr - Handle ISP CCP2 interrupts
559 * @ccp2: Pointer to ISP CCP2 device
561 * This will handle the CCP2 interrupts
563 void omap3isp_ccp2_isr(struct isp_ccp2_device *ccp2) in omap3isp_ccp2_isr() argument
565 struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity); in omap3isp_ccp2_isr()
566 struct isp_device *isp = to_isp_device(ccp2); in omap3isp_ccp2_isr()
589 dev_dbg(isp->dev, "CCP2 err:%x\n", lcx_irqstatus); in omap3isp_ccp2_isr()
595 dev_dbg(isp->dev, "CCP2 OCP err:%x\n", lcm_irqstatus); in omap3isp_ccp2_isr()
598 if (omap3isp_module_sync_is_stopping(&ccp2->wait, &ccp2->stopping)) in omap3isp_ccp2_isr()
603 ccp2_isr_buffer(ccp2); in omap3isp_ccp2_isr()
616 * __ccp2_get_format - helper function for getting ccp2 format
617 * @ccp2 : Pointer to ISP CCP2 device
624 __ccp2_get_format(struct isp_ccp2_device *ccp2, struct v4l2_subdev_pad_config *cfg, in __ccp2_get_format() argument
628 return v4l2_subdev_get_try_format(&ccp2->subdev, cfg, pad); in __ccp2_get_format()
630 return &ccp2->formats[pad]; in __ccp2_get_format()
635 * @ccp2 : Pointer to ISP CCP2 device
641 static void ccp2_try_format(struct isp_ccp2_device *ccp2, in ccp2_try_format() argument
653 if (ccp2->input == CCP2_INPUT_SENSOR) { in ccp2_try_format()
660 } else if (ccp2->input == CCP2_INPUT_MEMORY) { in ccp2_try_format()
672 * to SGRBG10_1X10 as we don't support CCP2 write to memory. in ccp2_try_format()
673 * When CCP2 write to memory feature will be added this in ccp2_try_format()
676 format = __ccp2_get_format(ccp2, cfg, CCP2_PAD_SINK, which); in ccp2_try_format()
697 struct isp_ccp2_device *ccp2 = v4l2_get_subdevdata(sd); in ccp2_enum_mbus_code() local
709 format = __ccp2_get_format(ccp2, cfg, CCP2_PAD_SINK, in ccp2_enum_mbus_code()
721 struct isp_ccp2_device *ccp2 = v4l2_get_subdevdata(sd); in ccp2_enum_frame_size() local
730 ccp2_try_format(ccp2, cfg, fse->pad, &format, fse->which); in ccp2_enum_frame_size()
740 ccp2_try_format(ccp2, cfg, fse->pad, &format, fse->which); in ccp2_enum_frame_size()
757 struct isp_ccp2_device *ccp2 = v4l2_get_subdevdata(sd); in ccp2_get_format() local
760 format = __ccp2_get_format(ccp2, cfg, fmt->pad, fmt->which); in ccp2_get_format()
778 struct isp_ccp2_device *ccp2 = v4l2_get_subdevdata(sd); in ccp2_set_format() local
781 format = __ccp2_get_format(ccp2, cfg, fmt->pad, fmt->which); in ccp2_set_format()
785 ccp2_try_format(ccp2, cfg, fmt->pad, &fmt->format, fmt->which); in ccp2_set_format()
790 format = __ccp2_get_format(ccp2, cfg, CCP2_PAD_SOURCE, in ccp2_set_format()
793 ccp2_try_format(ccp2, cfg, CCP2_PAD_SOURCE, format, fmt->which); in ccp2_set_format()
801 * @sd: ISP CCP2 V4L2 subdevice
824 * ccp2_s_stream - Enable/Disable streaming on ccp2 subdev
831 struct isp_ccp2_device *ccp2 = v4l2_get_subdevdata(sd); in ccp2_s_stream() local
832 struct isp_device *isp = to_isp_device(ccp2); in ccp2_s_stream()
833 struct device *dev = to_device(ccp2); in ccp2_s_stream()
836 if (ccp2->state == ISP_PIPELINE_STREAM_STOPPED) { in ccp2_s_stream()
839 atomic_set(&ccp2->stopping, 0); in ccp2_s_stream()
844 if (ccp2->phy) { in ccp2_s_stream()
845 ret = omap3isp_csiphy_acquire(ccp2->phy, &sd->entity); in ccp2_s_stream()
850 ccp2_if_configure(ccp2); in ccp2_s_stream()
851 ccp2_print_status(ccp2); in ccp2_s_stream()
853 /* Enable CSI1/CCP2 interface */ in ccp2_s_stream()
854 ret = ccp2_if_enable(ccp2, 1); in ccp2_s_stream()
856 if (ccp2->phy) in ccp2_s_stream()
857 omap3isp_csiphy_release(ccp2->phy); in ccp2_s_stream()
863 if (ccp2->state != ISP_PIPELINE_STREAM_SINGLESHOT) { in ccp2_s_stream()
866 format = &ccp2->formats[CCP2_PAD_SINK]; in ccp2_s_stream()
868 ccp2->mem_cfg.hsize_count = format->width; in ccp2_s_stream()
869 ccp2->mem_cfg.vsize_count = format->height; in ccp2_s_stream()
870 ccp2->mem_cfg.src_ofst = 0; in ccp2_s_stream()
872 ccp2_mem_configure(ccp2, &ccp2->mem_cfg); in ccp2_s_stream()
874 ccp2_print_status(ccp2); in ccp2_s_stream()
876 ccp2_mem_enable(ccp2, 1); in ccp2_s_stream()
880 if (omap3isp_module_sync_idle(&sd->entity, &ccp2->wait, in ccp2_s_stream()
881 &ccp2->stopping)) in ccp2_s_stream()
883 if (ccp2->input == CCP2_INPUT_MEMORY) { in ccp2_s_stream()
884 ccp2_mem_enable(ccp2, 0); in ccp2_s_stream()
886 } else if (ccp2->input == CCP2_INPUT_SENSOR) { in ccp2_s_stream()
887 /* Disable CSI1/CCP2 interface */ in ccp2_s_stream()
888 ccp2_if_enable(ccp2, 0); in ccp2_s_stream()
889 if (ccp2->phy) in ccp2_s_stream()
890 omap3isp_csiphy_release(ccp2->phy); in ccp2_s_stream()
895 ccp2->state = enable; in ccp2_s_stream()
924 * ISP ccp2 video device node
935 struct isp_ccp2_device *ccp2 = &video->isp->isp_ccp2; in ccp2_video_queue() local
937 ccp2_set_inaddr(ccp2, buffer->dma); in ccp2_video_queue()
950 * ccp2_link_setup - Setup ccp2 connections.
962 struct isp_ccp2_device *ccp2 = v4l2_get_subdevdata(sd); in ccp2_link_setup() local
973 if (ccp2->input == CCP2_INPUT_SENSOR) in ccp2_link_setup()
975 ccp2->input = CCP2_INPUT_MEMORY; in ccp2_link_setup()
977 if (ccp2->input == CCP2_INPUT_MEMORY) in ccp2_link_setup()
978 ccp2->input = CCP2_INPUT_NONE; in ccp2_link_setup()
985 if (ccp2->input == CCP2_INPUT_MEMORY) in ccp2_link_setup()
987 ccp2->input = CCP2_INPUT_SENSOR; in ccp2_link_setup()
989 if (ccp2->input == CCP2_INPUT_SENSOR) in ccp2_link_setup()
990 ccp2->input = CCP2_INPUT_NONE; in ccp2_link_setup()
996 ccp2->output = CCP2_OUTPUT_CCDC; in ccp2_link_setup()
998 ccp2->output = CCP2_OUTPUT_NONE; in ccp2_link_setup()
1016 * @ccp2: Pointer to ISP CCP2 device
1018 void omap3isp_ccp2_unregister_entities(struct isp_ccp2_device *ccp2) in omap3isp_ccp2_unregister_entities() argument
1020 v4l2_device_unregister_subdev(&ccp2->subdev); in omap3isp_ccp2_unregister_entities()
1021 omap3isp_video_unregister(&ccp2->video_in); in omap3isp_ccp2_unregister_entities()
1026 * @ccp2: Pointer to ISP CCP2 device
1031 int omap3isp_ccp2_register_entities(struct isp_ccp2_device *ccp2, in omap3isp_ccp2_register_entities() argument
1037 ccp2->subdev.dev = vdev->mdev->dev; in omap3isp_ccp2_register_entities()
1038 ret = v4l2_device_register_subdev(vdev, &ccp2->subdev); in omap3isp_ccp2_register_entities()
1042 ret = omap3isp_video_register(&ccp2->video_in, vdev); in omap3isp_ccp2_register_entities()
1049 omap3isp_ccp2_unregister_entities(ccp2); in omap3isp_ccp2_register_entities()
1054 * ISP ccp2 initialisation and cleanup
1058 * ccp2_init_entities - Initialize ccp2 subdev and media entity.
1059 * @ccp2: Pointer to ISP CCP2 device
1062 static int ccp2_init_entities(struct isp_ccp2_device *ccp2) in ccp2_init_entities() argument
1064 struct v4l2_subdev *sd = &ccp2->subdev; in ccp2_init_entities()
1065 struct media_pad *pads = ccp2->pads; in ccp2_init_entities()
1069 ccp2->input = CCP2_INPUT_NONE; in ccp2_init_entities()
1070 ccp2->output = CCP2_OUTPUT_NONE; in ccp2_init_entities()
1074 strlcpy(sd->name, "OMAP3 ISP CCP2", sizeof(sd->name)); in ccp2_init_entities()
1076 v4l2_set_subdevdata(sd, ccp2); in ccp2_init_entities()
1091 * The CCP2 has weird line alignment requirements, possibly caused by in ccp2_init_entities()
1101 ccp2->video_in.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in ccp2_init_entities()
1102 ccp2->video_in.bpl_alignment = 32; in ccp2_init_entities()
1103 ccp2->video_in.bpl_max = 0xffffffe0; in ccp2_init_entities()
1104 ccp2->video_in.isp = to_isp_device(ccp2); in ccp2_init_entities()
1105 ccp2->video_in.ops = &ccp2_video_ops; in ccp2_init_entities()
1106 ccp2->video_in.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; in ccp2_init_entities()
1108 ret = omap3isp_video_init(&ccp2->video_in, "CCP2"); in ccp2_init_entities()
1115 media_entity_cleanup(&ccp2->subdev.entity); in ccp2_init_entities()
1120 * omap3isp_ccp2_init - CCP2 initialization.
1126 struct isp_ccp2_device *ccp2 = &isp->isp_ccp2; in omap3isp_ccp2_init() local
1129 init_waitqueue_head(&ccp2->wait); in omap3isp_ccp2_init()
1136 * On the OMAP36xx, the CCP2 uses the CSI PHY1 or PHY2, shared with in omap3isp_ccp2_init()
1143 ccp2->vdds_csib = devm_regulator_get(isp->dev, "vdds_csib"); in omap3isp_ccp2_init()
1144 if (IS_ERR(ccp2->vdds_csib)) { in omap3isp_ccp2_init()
1145 if (PTR_ERR(ccp2->vdds_csib) == -EPROBE_DEFER) { in omap3isp_ccp2_init()
1152 ccp2->vdds_csib = NULL; in omap3isp_ccp2_init()
1154 ccp2->phy = &isp->isp_csiphy2; in omap3isp_ccp2_init()
1156 ccp2->phy = &isp->isp_csiphy1; in omap3isp_ccp2_init()
1159 ret = ccp2_init_entities(ccp2); in omap3isp_ccp2_init()
1163 ccp2_reset(ccp2); in omap3isp_ccp2_init()
1168 * omap3isp_ccp2_cleanup - CCP2 un-initialization
1173 struct isp_ccp2_device *ccp2 = &isp->isp_ccp2; in omap3isp_ccp2_cleanup() local
1175 omap3isp_video_cleanup(&ccp2->video_in); in omap3isp_ccp2_cleanup()
1176 media_entity_cleanup(&ccp2->subdev.entity); in omap3isp_ccp2_cleanup()