Lines Matching defs:ccdc
32 __ccdc_get_format(struct isp_ccdc_device *ccdc,
58 * @ccdc: Pointer to ISP CCDC device.
66 static void ccdc_print_status(struct isp_ccdc_device *ccdc)
68 struct isp_device *isp = to_isp_device(ccdc);
111 * @ccdc: Pointer to ISP CCDC device.
113 int omap3isp_ccdc_busy(struct isp_ccdc_device *ccdc)
115 struct isp_device *isp = to_isp_device(ccdc);
127 * @ccdc: Pointer to ISP CCDC device.
132 static int ccdc_lsc_validate_config(struct isp_ccdc_device *ccdc,
135 struct isp_device *isp = to_isp_device(ccdc);
162 format = __ccdc_get_format(ccdc, NULL, CCDC_PAD_SINK,
194 * @ccdc: Pointer to ISP CCDC device.
196 static void ccdc_lsc_program_table(struct isp_ccdc_device *ccdc,
199 isp_reg_writel(to_isp_device(ccdc), addr,
205 * @ccdc: Pointer to ISP CCDC device.
207 static void ccdc_lsc_setup_regs(struct isp_ccdc_device *ccdc,
210 struct isp_device *isp = to_isp_device(ccdc);
231 static int ccdc_lsc_wait_prefetch(struct isp_ccdc_device *ccdc)
233 struct isp_device *isp = to_isp_device(ccdc);
257 * @ccdc: Pointer to ISP CCDC device.
260 static int __ccdc_lsc_enable(struct isp_ccdc_device *ccdc, int enable)
262 struct isp_device *isp = to_isp_device(ccdc);
264 __ccdc_get_format(ccdc, NULL, CCDC_PAD_SINK,
280 if (ccdc_lsc_wait_prefetch(ccdc) < 0) {
283 ccdc->lsc.state = LSC_STATE_STOPPED;
284 dev_warn(to_device(ccdc), "LSC prefetch timeout\n");
287 ccdc->lsc.state = LSC_STATE_RUNNING;
289 ccdc->lsc.state = LSC_STATE_STOPPING;
295 static int ccdc_lsc_busy(struct isp_ccdc_device *ccdc)
297 struct isp_device *isp = to_isp_device(ccdc);
305 * @ccdc: Pointer to ISP CCDC device
308 static int __ccdc_lsc_configure(struct isp_ccdc_device *ccdc,
314 if (ccdc_lsc_validate_config(ccdc, &req->config) < 0) {
315 dev_dbg(to_device(ccdc), "Discard LSC configuration\n");
319 if (ccdc_lsc_busy(ccdc))
322 ccdc_lsc_setup_regs(ccdc, &req->config);
323 ccdc_lsc_program_table(ccdc, req->table.dma);
329 * @ccdc: Pointer to ISP CCDC device.
333 static void ccdc_lsc_error_handler(struct isp_ccdc_device *ccdc)
335 struct isp_device *isp = to_isp_device(ccdc);
347 ccdc->lsc.state = LSC_STATE_STOPPED;
350 static void ccdc_lsc_free_request(struct isp_ccdc_device *ccdc,
353 struct isp_device *isp = to_isp_device(ccdc);
367 static void ccdc_lsc_free_queue(struct isp_ccdc_device *ccdc,
373 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
376 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
377 ccdc_lsc_free_request(ccdc, req);
378 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
380 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
385 struct isp_ccdc_device *ccdc;
389 ccdc = container_of(lsc, struct isp_ccdc_device, lsc);
391 ccdc_lsc_free_queue(ccdc, &lsc->free_queue);
401 static int ccdc_lsc_config(struct isp_ccdc_device *ccdc,
404 struct isp_device *isp = to_isp_device(ccdc);
416 dev_dbg(to_device(ccdc),
462 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
463 if (ccdc->lsc.request) {
464 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue);
465 schedule_work(&ccdc->lsc.table_work);
467 ccdc->lsc.request = req;
468 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
474 ccdc_lsc_free_request(ccdc, req);
479 static inline int ccdc_lsc_is_configured(struct isp_ccdc_device *ccdc)
484 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
485 ret = ccdc->lsc.active != NULL;
486 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
491 static int ccdc_lsc_enable(struct isp_ccdc_device *ccdc)
493 struct ispccdc_lsc *lsc = &ccdc->lsc;
503 if (__ccdc_lsc_configure(ccdc, lsc->request) < 0) {
504 omap3isp_sbl_disable(to_isp_device(ccdc),
513 __ccdc_lsc_enable(ccdc, 1);
528 * @ccdc: Pointer to ISP CCDC device.
533 static void ccdc_configure_clamp(struct isp_ccdc_device *ccdc)
535 struct isp_device *isp = to_isp_device(ccdc);
538 if (ccdc->obclamp) {
539 clamp = ccdc->clamp.obgain << ISPCCDC_CLAMP_OBGAIN_SHIFT;
540 clamp |= ccdc->clamp.oblen << ISPCCDC_CLAMP_OBSLEN_SHIFT;
541 clamp |= ccdc->clamp.oblines << ISPCCDC_CLAMP_OBSLN_SHIFT;
542 clamp |= ccdc->clamp.obstpixel << ISPCCDC_CLAMP_OBST_SHIFT;
545 isp_reg_writel(isp, ccdc->clamp.dcsubval,
551 ccdc->obclamp ? ISPCCDC_CLAMP_CLAMPEN : 0);
556 * @ccdc: Pointer to ISP CCDC device.
558 static void ccdc_configure_fpc(struct isp_ccdc_device *ccdc)
560 struct isp_device *isp = to_isp_device(ccdc);
564 if (!ccdc->fpc_en)
567 isp_reg_writel(isp, ccdc->fpc.dma, OMAP3_ISP_IOMEM_CCDC,
570 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT),
572 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT) |
578 * @ccdc: Pointer to ISP CCDC device.
580 static void ccdc_configure_black_comp(struct isp_ccdc_device *ccdc)
582 struct isp_device *isp = to_isp_device(ccdc);
585 blcomp = ccdc->blcomp.b_mg << ISPCCDC_BLKCMP_B_MG_SHIFT;
586 blcomp |= ccdc->blcomp.gb_g << ISPCCDC_BLKCMP_GB_G_SHIFT;
587 blcomp |= ccdc->blcomp.gr_cy << ISPCCDC_BLKCMP_GR_CY_SHIFT;
588 blcomp |= ccdc->blcomp.r_ye << ISPCCDC_BLKCMP_R_YE_SHIFT;
595 * @ccdc: Pointer to ISP CCDC device.
597 static void ccdc_configure_lpf(struct isp_ccdc_device *ccdc)
599 struct isp_device *isp = to_isp_device(ccdc);
603 ccdc->lpf ? ISPCCDC_SYN_MODE_LPF : 0);
608 * @ccdc: Pointer to ISP CCDC device.
610 static void ccdc_configure_alaw(struct isp_ccdc_device *ccdc)
612 struct isp_device *isp = to_isp_device(ccdc);
616 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code);
636 if (ccdc->alaw)
644 * @ccdc: Pointer to ISP CCDC device.
647 static void ccdc_config_imgattr(struct isp_ccdc_device *ccdc, u32 colptn)
649 struct isp_device *isp = to_isp_device(ccdc);
656 * @ccdc: Pointer to ISP CCDC device.
663 static int ccdc_config(struct isp_ccdc_device *ccdc,
666 struct isp_device *isp = to_isp_device(ccdc);
669 spin_lock_irqsave(&ccdc->lock, flags);
670 ccdc->shadow_update = 1;
671 spin_unlock_irqrestore(&ccdc->lock, flags);
674 ccdc->alaw = !!(OMAP3ISP_CCDC_ALAW & ccdc_struct->flag);
675 ccdc->update |= OMAP3ISP_CCDC_ALAW;
679 ccdc->lpf = !!(OMAP3ISP_CCDC_LPF & ccdc_struct->flag);
680 ccdc->update |= OMAP3ISP_CCDC_LPF;
684 if (copy_from_user(&ccdc->clamp, ccdc_struct->bclamp,
685 sizeof(ccdc->clamp))) {
686 ccdc->shadow_update = 0;
690 ccdc->obclamp = !!(OMAP3ISP_CCDC_BLCLAMP & ccdc_struct->flag);
691 ccdc->update |= OMAP3ISP_CCDC_BLCLAMP;
695 if (copy_from_user(&ccdc->blcomp, ccdc_struct->blcomp,
696 sizeof(ccdc->blcomp))) {
697 ccdc->shadow_update = 0;
701 ccdc->update |= OMAP3ISP_CCDC_BCOMP;
704 ccdc->shadow_update = 0;
712 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED)
715 ccdc->fpc_en = !!(OMAP3ISP_CCDC_FPC & ccdc_struct->flag);
717 if (ccdc->fpc_en) {
742 fpc_old = ccdc->fpc;
743 ccdc->fpc = fpc_new;
746 ccdc_configure_fpc(ccdc);
753 return ccdc_lsc_config(ccdc, ccdc_struct);
756 static void ccdc_apply_controls(struct isp_ccdc_device *ccdc)
758 if (ccdc->update & OMAP3ISP_CCDC_ALAW) {
759 ccdc_configure_alaw(ccdc);
760 ccdc->update &= ~OMAP3ISP_CCDC_ALAW;
763 if (ccdc->update & OMAP3ISP_CCDC_LPF) {
764 ccdc_configure_lpf(ccdc);
765 ccdc->update &= ~OMAP3ISP_CCDC_LPF;
768 if (ccdc->update & OMAP3ISP_CCDC_BLCLAMP) {
769 ccdc_configure_clamp(ccdc);
770 ccdc->update &= ~OMAP3ISP_CCDC_BLCLAMP;
773 if (ccdc->update & OMAP3ISP_CCDC_BCOMP) {
774 ccdc_configure_black_comp(ccdc);
775 ccdc->update &= ~OMAP3ISP_CCDC_BCOMP;
785 struct isp_ccdc_device *ccdc = &isp->isp_ccdc;
789 ccdc->update = OMAP3ISP_CCDC_ALAW | OMAP3ISP_CCDC_LPF
791 ccdc_apply_controls(ccdc);
792 ccdc_configure_fpc(ccdc);
801 * @ccdc: Pointer to ISP CCDC device.
803 static void ccdc_config_vp(struct isp_ccdc_device *ccdc)
805 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity);
806 struct isp_device *isp = to_isp_device(ccdc);
814 format = &ccdc->formats[CCDC_PAD_SOURCE_VP];
835 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code);
866 * @ccdc: Pointer to ISP CCDC device.
884 static void ccdc_config_outlineoffset(struct isp_ccdc_device *ccdc,
888 struct isp_device *isp = to_isp_device(ccdc);
916 * @ccdc: Pointer to ISP CCDC device.
921 static void ccdc_set_outaddr(struct isp_ccdc_device *ccdc, u32 addr)
923 struct isp_device *isp = to_isp_device(ccdc);
930 * @ccdc: Pointer to ISP CCDC device.
935 void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc,
938 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity);
948 if (ccdc->input == CCDC_INPUT_PARALLEL)
958 * @ccdc: Pointer to ISP CCDC device.
962 static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc,
966 struct isp_device *isp = to_isp_device(ccdc);
970 format = &ccdc->formats[CCDC_PAD_SINK];
980 if (ccdc->bt656)
1010 if ((parcfg && parcfg->vs_pol) || ccdc->bt656)
1031 if (ccdc->bt656)
1113 static void ccdc_configure(struct isp_ccdc_device *ccdc)
1115 struct isp_device *isp = to_isp_device(ccdc);
1135 ccdc->bt656 = false;
1136 ccdc->fields = 0;
1138 pad = media_pad_remote_pad_first(&ccdc->pads[CCDC_PAD_SINK]);
1140 if (ccdc->input == CCDC_INPUT_PARALLEL) {
1142 to_isp_pipeline(&ccdc->subdev.entity)->external;
1150 ccdc->bt656 = parcfg->bt656;
1154 format = &ccdc->formats[CCDC_PAD_SINK];
1169 if (ccdc->bt656)
1178 omap3isp_configure_bridge(isp, ccdc->input, parcfg, shift, bridge);
1181 ccdc_config_sync_if(ccdc, parcfg, depth_out);
1190 if (ccdc->output & CCDC_OUTPUT_MEMORY)
1195 if (ccdc->output & CCDC_OUTPUT_RESIZER)
1219 ccdc_config_imgattr(ccdc, ccdc_pattern);
1229 format = &ccdc->formats[CCDC_PAD_SOURCE_OF];
1230 crop = &ccdc->crop;
1237 if (ccdc->bt656) {
1255 ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value,
1262 if (ccdc->formats[CCDC_PAD_SINK].field == V4L2_FIELD_ALTERNATE &&
1281 if (omap3isp_video_format_info(format->code)->width <= 8 || ccdc->bt656)
1289 ccdc_config_vp(ccdc);
1292 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
1293 if (ccdc->lsc.request == NULL)
1296 WARN_ON(ccdc->lsc.active);
1301 if (ccdc->lsc.active == NULL &&
1302 __ccdc_lsc_configure(ccdc, ccdc->lsc.request) == 0) {
1303 ccdc->lsc.active = ccdc->lsc.request;
1305 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue);
1306 schedule_work(&ccdc->lsc.table_work);
1309 ccdc->lsc.request = NULL;
1312 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
1314 ccdc_apply_controls(ccdc);
1317 static void __ccdc_enable(struct isp_ccdc_device *ccdc, int enable)
1319 struct isp_device *isp = to_isp_device(ccdc);
1322 if (enable && ccdc->stopping & CCDC_STOP_REQUEST)
1328 ccdc->running = enable;
1331 static int ccdc_disable(struct isp_ccdc_device *ccdc)
1336 spin_lock_irqsave(&ccdc->lock, flags);
1337 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS)
1338 ccdc->stopping = CCDC_STOP_REQUEST;
1339 if (!ccdc->running)
1340 ccdc->stopping = CCDC_STOP_FINISHED;
1341 spin_unlock_irqrestore(&ccdc->lock, flags);
1343 ret = wait_event_timeout(ccdc->wait,
1344 ccdc->stopping == CCDC_STOP_FINISHED,
1348 dev_warn(to_device(ccdc), "CCDC stop timeout!\n");
1351 omap3isp_sbl_disable(to_isp_device(ccdc), OMAP3_ISP_SBL_CCDC_LSC_READ);
1353 mutex_lock(&ccdc->ioctl_lock);
1354 ccdc_lsc_free_request(ccdc, ccdc->lsc.request);
1355 ccdc->lsc.request = ccdc->lsc.active;
1356 ccdc->lsc.active = NULL;
1357 cancel_work_sync(&ccdc->lsc.table_work);
1358 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue);
1359 mutex_unlock(&ccdc->ioctl_lock);
1361 ccdc->stopping = CCDC_STOP_NOT_REQUESTED;
1366 static void ccdc_enable(struct isp_ccdc_device *ccdc)
1368 if (ccdc_lsc_is_configured(ccdc))
1369 __ccdc_lsc_enable(ccdc, 1);
1370 __ccdc_enable(ccdc, 1);
1379 * @ccdc: Pointer to ISP CCDC device.
1384 static int ccdc_sbl_busy(struct isp_ccdc_device *ccdc)
1386 struct isp_device *isp = to_isp_device(ccdc);
1388 return omap3isp_ccdc_busy(ccdc)
1401 * @ccdc: Pointer to ISP CCDC device.
1404 static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc,
1413 if (!ccdc_sbl_busy(ccdc))
1424 * @ccdc: Pointer to ISP CCDC device.
1430 static int ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event)
1434 switch ((ccdc->stopping & 3) | event) {
1436 if (ccdc->lsc.state != LSC_STATE_STOPPED)
1437 __ccdc_lsc_enable(ccdc, 0);
1438 __ccdc_enable(ccdc, 0);
1439 ccdc->stopping = CCDC_STOP_EXECUTED;
1443 ccdc->stopping |= CCDC_STOP_CCDC_FINISHED;
1444 if (ccdc->lsc.state == LSC_STATE_STOPPED)
1445 ccdc->stopping |= CCDC_STOP_LSC_FINISHED;
1450 ccdc->stopping |= CCDC_STOP_LSC_FINISHED;
1458 if (ccdc->stopping == CCDC_STOP_FINISHED) {
1459 wake_up(&ccdc->wait);
1466 static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc)
1468 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity);
1469 struct video_device *vdev = ccdc->subdev.devnode;
1484 * @ccdc: Pointer to ISP CCDC device.
1487 static void ccdc_lsc_isr(struct isp_ccdc_device *ccdc, u32 events)
1493 to_isp_pipeline(&ccdc->subdev.entity);
1495 ccdc_lsc_error_handler(ccdc);
1497 dev_dbg(to_device(ccdc), "lsc prefetch error\n");
1507 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
1509 if (ccdc->lsc.state == LSC_STATE_STOPPING)
1510 ccdc->lsc.state = LSC_STATE_STOPPED;
1512 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_LSC_DONE))
1515 if (ccdc->lsc.state != LSC_STATE_RECONFIG)
1519 ccdc->lsc.state = LSC_STATE_STOPPED;
1531 if (ccdc->lsc.request == NULL)
1534 ccdc_lsc_enable(ccdc);
1537 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
1544 static bool ccdc_has_all_fields(struct isp_ccdc_device *ccdc)
1546 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity);
1547 struct isp_device *isp = to_isp_device(ccdc);
1548 enum v4l2_field of_field = ccdc->formats[CCDC_PAD_SOURCE_OF].field;
1569 ccdc->fields |= field == V4L2_FIELD_BOTTOM
1572 if (ccdc->fields != CCDC_FIELD_BOTH)
1583 ccdc->fields = 0;
1588 static int ccdc_isr_buffer(struct isp_ccdc_device *ccdc)
1590 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity);
1591 struct isp_device *isp = to_isp_device(ccdc);
1600 if (list_empty(&ccdc->video_out.dmaqueue))
1607 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && ccdc->underrun) {
1608 ccdc->underrun = 0;
1613 if (ccdc_sbl_wait_idle(ccdc, 1000)) {
1615 media_entity_enum_set(&isp->crashed, &ccdc->subdev.entity);
1621 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS &&
1622 ccdc->stopping & CCDC_STOP_REQUEST)
1625 if (!ccdc_has_all_fields(ccdc))
1628 buffer = omap3isp_video_buffer_next(&ccdc->video_out);
1630 ccdc_set_outaddr(ccdc, buffer->dma);
1634 if (ccdc->state == ISP_PIPELINE_STREAM_SINGLESHOT &&
1644 * @ccdc: Pointer to ISP CCDC device.
1648 static void ccdc_vd0_isr(struct isp_ccdc_device *ccdc)
1656 if (ccdc->bt656) {
1658 to_isp_pipeline(&ccdc->subdev.entity);
1667 if (ccdc->bt656) {
1668 spin_lock_irqsave(&ccdc->lock, flags);
1669 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS &&
1670 ccdc->output & CCDC_OUTPUT_MEMORY) {
1671 if (ccdc->lsc.state != LSC_STATE_STOPPED)
1672 __ccdc_lsc_enable(ccdc, 0);
1673 __ccdc_enable(ccdc, 0);
1675 ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1);
1676 spin_unlock_irqrestore(&ccdc->lock, flags);
1679 spin_lock_irqsave(&ccdc->lock, flags);
1680 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) {
1681 spin_unlock_irqrestore(&ccdc->lock, flags);
1685 if (ccdc->output & CCDC_OUTPUT_MEMORY)
1686 restart = ccdc_isr_buffer(ccdc);
1688 if (!ccdc->shadow_update)
1689 ccdc_apply_controls(ccdc);
1690 spin_unlock_irqrestore(&ccdc->lock, flags);
1693 ccdc_enable(ccdc);
1698 * @ccdc: Pointer to ISP CCDC device.
1700 static void ccdc_vd1_isr(struct isp_ccdc_device *ccdc)
1713 if (ccdc->bt656)
1716 spin_lock_irqsave(&ccdc->lsc.req_lock, flags);
1728 switch (ccdc->state) {
1730 ccdc->stopping = CCDC_STOP_REQUEST;
1734 if (ccdc->output & CCDC_OUTPUT_MEMORY) {
1735 if (ccdc->lsc.state != LSC_STATE_STOPPED)
1736 __ccdc_lsc_enable(ccdc, 0);
1737 __ccdc_enable(ccdc, 0);
1745 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1))
1748 if (ccdc->lsc.request == NULL)
1755 if (ccdc->lsc.state == LSC_STATE_RUNNING) {
1756 __ccdc_lsc_enable(ccdc, 0);
1757 ccdc->lsc.state = LSC_STATE_RECONFIG;
1762 if (ccdc->lsc.state == LSC_STATE_STOPPED)
1763 ccdc_lsc_enable(ccdc);
1766 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
1771 * @ccdc: Pointer to ISP CCDC device.
1774 int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc, u32 events)
1776 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED)
1780 ccdc_vd1_isr(ccdc);
1782 ccdc_lsc_isr(ccdc, events);
1785 ccdc_vd0_isr(ccdc);
1788 ccdc_hs_vs_isr(ccdc);
1799 struct isp_ccdc_device *ccdc = &video->isp->isp_ccdc;
1803 if (!(ccdc->output & CCDC_OUTPUT_MEMORY))
1806 ccdc_set_outaddr(ccdc, buffer->dma);
1814 spin_lock_irqsave(&ccdc->lock, flags);
1815 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && !ccdc->running &&
1816 ccdc->bt656)
1819 ccdc->underrun = 1;
1820 spin_unlock_irqrestore(&ccdc->lock, flags);
1823 ccdc_enable(ccdc);
1846 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
1851 mutex_lock(&ccdc->ioctl_lock);
1852 ret = ccdc_config(ccdc, arg);
1853 mutex_unlock(&ccdc->ioctl_lock);
1896 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
1897 struct isp_device *isp = to_isp_device(ccdc);
1900 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) {
1908 ccdc_configure(ccdc);
1910 ccdc_print_status(ccdc);
1915 if (ccdc->output & CCDC_OUTPUT_MEMORY)
1918 if (ccdc->underrun || !(ccdc->output & CCDC_OUTPUT_MEMORY))
1919 ccdc_enable(ccdc);
1921 ccdc->underrun = 0;
1925 if (ccdc->output & CCDC_OUTPUT_MEMORY &&
1926 ccdc->state != ISP_PIPELINE_STREAM_SINGLESHOT)
1929 ccdc_enable(ccdc);
1933 ret = ccdc_disable(ccdc);
1934 if (ccdc->output & CCDC_OUTPUT_MEMORY)
1937 ccdc->underrun = 0;
1941 ccdc->state = enable;
1946 __ccdc_get_format(struct isp_ccdc_device *ccdc,
1953 return &ccdc->formats[pad];
1957 __ccdc_get_crop(struct isp_ccdc_device *ccdc,
1965 return &ccdc->crop;
1970 * @ccdc: ISP CCDC device
1976 ccdc_try_format(struct isp_ccdc_device *ccdc,
2013 *fmt = *__ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK,
2039 crop = __ccdc_get_crop(ccdc, sd_state, which);
2056 *fmt = *__ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK,
2085 * @ccdc: ISP CCDC device
2089 static void ccdc_try_crop(struct isp_ccdc_device *ccdc,
2137 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2149 format = __ccdc_get_format(ccdc, sd_state, code->pad,
2180 format = __ccdc_get_format(ccdc, sd_state, code->pad,
2203 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2212 ccdc_try_format(ccdc, sd_state, fse->pad, &format, fse->which);
2222 ccdc_try_format(ccdc, sd_state, fse->pad, &format, fse->which);
2244 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2257 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK,
2259 ccdc_try_crop(ccdc, format, &sel->r);
2263 sel->r = *__ccdc_get_crop(ccdc, sd_state, sel->which);
2288 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2296 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED)
2304 sel->r = *__ccdc_get_crop(ccdc, sd_state, sel->which);
2308 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK, sel->which);
2309 ccdc_try_crop(ccdc, format, &sel->r);
2310 *__ccdc_get_crop(ccdc, sd_state, sel->which) = sel->r;
2313 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF,
2315 ccdc_try_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF, format,
2334 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2337 format = __ccdc_get_format(ccdc, sd_state, fmt->pad, fmt->which);
2358 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2362 format = __ccdc_get_format(ccdc, sd_state, fmt->pad, fmt->which);
2366 ccdc_try_format(ccdc, sd_state, fmt->pad, &fmt->format, fmt->which);
2372 crop = __ccdc_get_crop(ccdc, sd_state, fmt->which);
2378 ccdc_try_crop(ccdc, &fmt->format, crop);
2381 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF,
2384 ccdc_try_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF, format,
2387 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SOURCE_VP,
2390 ccdc_try_format(ccdc, sd_state, CCDC_PAD_SOURCE_VP, format,
2431 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2440 if (ccdc->input == CCDC_INPUT_PARALLEL) {
2539 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
2540 struct isp_device *isp = to_isp_device(ccdc);
2553 ccdc->input = CCDC_INPUT_NONE;
2557 if (ccdc->input != CCDC_INPUT_NONE)
2561 ccdc->input = CCDC_INPUT_CCP2B;
2563 ccdc->input = CCDC_INPUT_CSI2A;
2565 ccdc->input = CCDC_INPUT_CSI2C;
2567 ccdc->input = CCDC_INPUT_PARALLEL;
2581 if (ccdc->output & ~CCDC_OUTPUT_PREVIEW)
2583 ccdc->output |= CCDC_OUTPUT_PREVIEW;
2585 ccdc->output &= ~CCDC_OUTPUT_PREVIEW;
2592 if (ccdc->output & ~CCDC_OUTPUT_MEMORY)
2594 ccdc->output |= CCDC_OUTPUT_MEMORY;
2596 ccdc->output &= ~CCDC_OUTPUT_MEMORY;
2603 if (ccdc->output & ~CCDC_OUTPUT_RESIZER)
2605 ccdc->output |= CCDC_OUTPUT_RESIZER;
2607 ccdc->output &= ~CCDC_OUTPUT_RESIZER;
2624 void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc)
2626 v4l2_device_unregister_subdev(&ccdc->subdev);
2627 omap3isp_video_unregister(&ccdc->video_out);
2630 int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,
2636 ccdc->subdev.dev = vdev->mdev->dev;
2637 ret = v4l2_device_register_subdev(vdev, &ccdc->subdev);
2641 ret = omap3isp_video_register(&ccdc->video_out, vdev);
2648 omap3isp_ccdc_unregister_entities(ccdc);
2658 * @ccdc: ISP CCDC module
2662 static int ccdc_init_entities(struct isp_ccdc_device *ccdc)
2664 struct v4l2_subdev *sd = &ccdc->subdev;
2665 struct media_pad *pads = ccdc->pads;
2669 ccdc->input = CCDC_INPUT_NONE;
2675 v4l2_set_subdevdata(sd, ccdc);
2690 ccdc->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2691 ccdc->video_out.ops = &ccdc_video_ops;
2692 ccdc->video_out.isp = to_isp_device(ccdc);
2693 ccdc->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3;
2694 ccdc->video_out.bpl_alignment = 32;
2696 ret = omap3isp_video_init(&ccdc->video_out, "CCDC");
2717 struct isp_ccdc_device *ccdc = &isp->isp_ccdc;
2720 spin_lock_init(&ccdc->lock);
2721 init_waitqueue_head(&ccdc->wait);
2722 mutex_init(&ccdc->ioctl_lock);
2724 ccdc->stopping = CCDC_STOP_NOT_REQUESTED;
2726 INIT_WORK(&ccdc->lsc.table_work, ccdc_lsc_free_table_work);
2727 ccdc->lsc.state = LSC_STATE_STOPPED;
2728 INIT_LIST_HEAD(&ccdc->lsc.free_queue);
2729 spin_lock_init(&ccdc->lsc.req_lock);
2731 ccdc->clamp.oblen = 0;
2732 ccdc->clamp.dcsubval = 0;
2734 ccdc->update = OMAP3ISP_CCDC_BLCLAMP;
2735 ccdc_apply_controls(ccdc);
2737 ret = ccdc_init_entities(ccdc);
2739 mutex_destroy(&ccdc->ioctl_lock);
2752 struct isp_ccdc_device *ccdc = &isp->isp_ccdc;
2754 omap3isp_video_cleanup(&ccdc->video_out);
2755 media_entity_cleanup(&ccdc->subdev.entity);
2760 ccdc_lsc_free_request(ccdc, ccdc->lsc.request);
2761 cancel_work_sync(&ccdc->lsc.table_work);
2762 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue);
2764 if (ccdc->fpc.addr != NULL)
2765 dma_free_coherent(isp->dev, ccdc->fpc.fpnum * 4, ccdc->fpc.addr,
2766 ccdc->fpc.dma);
2768 mutex_destroy(&ccdc->ioctl_lock);