Lines Matching refs:ccdc

32 __ccdc_get_format(struct isp_ccdc_device *ccdc,
66 static void ccdc_print_status(struct isp_ccdc_device *ccdc) in ccdc_print_status() argument
68 struct isp_device *isp = to_isp_device(ccdc); in ccdc_print_status()
113 int omap3isp_ccdc_busy(struct isp_ccdc_device *ccdc) in omap3isp_ccdc_busy() argument
115 struct isp_device *isp = to_isp_device(ccdc); in omap3isp_ccdc_busy()
132 static int ccdc_lsc_validate_config(struct isp_ccdc_device *ccdc, in ccdc_lsc_validate_config() argument
135 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_validate_config()
162 format = __ccdc_get_format(ccdc, NULL, CCDC_PAD_SINK, in ccdc_lsc_validate_config()
196 static void ccdc_lsc_program_table(struct isp_ccdc_device *ccdc, in ccdc_lsc_program_table() argument
199 isp_reg_writel(to_isp_device(ccdc), addr, in ccdc_lsc_program_table()
207 static void ccdc_lsc_setup_regs(struct isp_ccdc_device *ccdc, in ccdc_lsc_setup_regs() argument
210 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_setup_regs()
231 static int ccdc_lsc_wait_prefetch(struct isp_ccdc_device *ccdc) in ccdc_lsc_wait_prefetch() argument
233 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_wait_prefetch()
260 static int __ccdc_lsc_enable(struct isp_ccdc_device *ccdc, int enable) in __ccdc_lsc_enable() argument
262 struct isp_device *isp = to_isp_device(ccdc); in __ccdc_lsc_enable()
264 __ccdc_get_format(ccdc, NULL, CCDC_PAD_SINK, in __ccdc_lsc_enable()
280 if (ccdc_lsc_wait_prefetch(ccdc) < 0) { in __ccdc_lsc_enable()
283 ccdc->lsc.state = LSC_STATE_STOPPED; in __ccdc_lsc_enable()
284 dev_warn(to_device(ccdc), "LSC prefetch timeout\n"); in __ccdc_lsc_enable()
287 ccdc->lsc.state = LSC_STATE_RUNNING; in __ccdc_lsc_enable()
289 ccdc->lsc.state = LSC_STATE_STOPPING; in __ccdc_lsc_enable()
295 static int ccdc_lsc_busy(struct isp_ccdc_device *ccdc) in ccdc_lsc_busy() argument
297 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_busy()
308 static int __ccdc_lsc_configure(struct isp_ccdc_device *ccdc, in __ccdc_lsc_configure() argument
314 if (ccdc_lsc_validate_config(ccdc, &req->config) < 0) { in __ccdc_lsc_configure()
315 dev_dbg(to_device(ccdc), "Discard LSC configuration\n"); in __ccdc_lsc_configure()
319 if (ccdc_lsc_busy(ccdc)) in __ccdc_lsc_configure()
322 ccdc_lsc_setup_regs(ccdc, &req->config); in __ccdc_lsc_configure()
323 ccdc_lsc_program_table(ccdc, req->table.dma); in __ccdc_lsc_configure()
333 static void ccdc_lsc_error_handler(struct isp_ccdc_device *ccdc) in ccdc_lsc_error_handler() argument
335 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_error_handler()
347 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_error_handler()
350 static void ccdc_lsc_free_request(struct isp_ccdc_device *ccdc, in ccdc_lsc_free_request() argument
353 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_free_request()
367 static void ccdc_lsc_free_queue(struct isp_ccdc_device *ccdc, in ccdc_lsc_free_queue() argument
373 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
376 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
377 ccdc_lsc_free_request(ccdc, req); in ccdc_lsc_free_queue()
378 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
380 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
385 struct isp_ccdc_device *ccdc; in ccdc_lsc_free_table_work() local
389 ccdc = container_of(lsc, struct isp_ccdc_device, lsc); in ccdc_lsc_free_table_work()
391 ccdc_lsc_free_queue(ccdc, &lsc->free_queue); in ccdc_lsc_free_table_work()
401 static int ccdc_lsc_config(struct isp_ccdc_device *ccdc, in ccdc_lsc_config() argument
404 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_config()
416 dev_dbg(to_device(ccdc), in ccdc_lsc_config()
462 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_config()
463 if (ccdc->lsc.request) { in ccdc_lsc_config()
464 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue); in ccdc_lsc_config()
465 schedule_work(&ccdc->lsc.table_work); in ccdc_lsc_config()
467 ccdc->lsc.request = req; in ccdc_lsc_config()
468 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_config()
474 ccdc_lsc_free_request(ccdc, req); in ccdc_lsc_config()
479 static inline int ccdc_lsc_is_configured(struct isp_ccdc_device *ccdc) in ccdc_lsc_is_configured() argument
484 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_is_configured()
485 ret = ccdc->lsc.active != NULL; in ccdc_lsc_is_configured()
486 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_is_configured()
491 static int ccdc_lsc_enable(struct isp_ccdc_device *ccdc) in ccdc_lsc_enable() argument
493 struct ispccdc_lsc *lsc = &ccdc->lsc; in ccdc_lsc_enable()
503 if (__ccdc_lsc_configure(ccdc, lsc->request) < 0) { in ccdc_lsc_enable()
504 omap3isp_sbl_disable(to_isp_device(ccdc), in ccdc_lsc_enable()
513 __ccdc_lsc_enable(ccdc, 1); in ccdc_lsc_enable()
533 static void ccdc_configure_clamp(struct isp_ccdc_device *ccdc) in ccdc_configure_clamp() argument
535 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_clamp()
538 if (ccdc->obclamp) { in ccdc_configure_clamp()
539 clamp = ccdc->clamp.obgain << ISPCCDC_CLAMP_OBGAIN_SHIFT; in ccdc_configure_clamp()
540 clamp |= ccdc->clamp.oblen << ISPCCDC_CLAMP_OBSLEN_SHIFT; in ccdc_configure_clamp()
541 clamp |= ccdc->clamp.oblines << ISPCCDC_CLAMP_OBSLN_SHIFT; in ccdc_configure_clamp()
542 clamp |= ccdc->clamp.obstpixel << ISPCCDC_CLAMP_OBST_SHIFT; in ccdc_configure_clamp()
545 isp_reg_writel(isp, ccdc->clamp.dcsubval, in ccdc_configure_clamp()
551 ccdc->obclamp ? ISPCCDC_CLAMP_CLAMPEN : 0); in ccdc_configure_clamp()
558 static void ccdc_configure_fpc(struct isp_ccdc_device *ccdc) in ccdc_configure_fpc() argument
560 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_fpc()
564 if (!ccdc->fpc_en) in ccdc_configure_fpc()
567 isp_reg_writel(isp, ccdc->fpc.dma, OMAP3_ISP_IOMEM_CCDC, in ccdc_configure_fpc()
570 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT), in ccdc_configure_fpc()
572 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT) | in ccdc_configure_fpc()
580 static void ccdc_configure_black_comp(struct isp_ccdc_device *ccdc) in ccdc_configure_black_comp() argument
582 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_black_comp()
585 blcomp = ccdc->blcomp.b_mg << ISPCCDC_BLKCMP_B_MG_SHIFT; in ccdc_configure_black_comp()
586 blcomp |= ccdc->blcomp.gb_g << ISPCCDC_BLKCMP_GB_G_SHIFT; in ccdc_configure_black_comp()
587 blcomp |= ccdc->blcomp.gr_cy << ISPCCDC_BLKCMP_GR_CY_SHIFT; in ccdc_configure_black_comp()
588 blcomp |= ccdc->blcomp.r_ye << ISPCCDC_BLKCMP_R_YE_SHIFT; in ccdc_configure_black_comp()
597 static void ccdc_configure_lpf(struct isp_ccdc_device *ccdc) in ccdc_configure_lpf() argument
599 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_lpf()
603 ccdc->lpf ? ISPCCDC_SYN_MODE_LPF : 0); in ccdc_configure_lpf()
610 static void ccdc_configure_alaw(struct isp_ccdc_device *ccdc) in ccdc_configure_alaw() argument
612 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_alaw()
616 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code); in ccdc_configure_alaw()
636 if (ccdc->alaw) in ccdc_configure_alaw()
647 static void ccdc_config_imgattr(struct isp_ccdc_device *ccdc, u32 colptn) in ccdc_config_imgattr() argument
649 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_imgattr()
663 static int ccdc_config(struct isp_ccdc_device *ccdc, in ccdc_config() argument
666 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config()
669 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_config()
670 ccdc->shadow_update = 1; in ccdc_config()
671 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_config()
674 ccdc->alaw = !!(OMAP3ISP_CCDC_ALAW & ccdc_struct->flag); in ccdc_config()
675 ccdc->update |= OMAP3ISP_CCDC_ALAW; in ccdc_config()
679 ccdc->lpf = !!(OMAP3ISP_CCDC_LPF & ccdc_struct->flag); in ccdc_config()
680 ccdc->update |= OMAP3ISP_CCDC_LPF; in ccdc_config()
684 if (copy_from_user(&ccdc->clamp, ccdc_struct->bclamp, in ccdc_config()
685 sizeof(ccdc->clamp))) { in ccdc_config()
686 ccdc->shadow_update = 0; in ccdc_config()
690 ccdc->obclamp = !!(OMAP3ISP_CCDC_BLCLAMP & ccdc_struct->flag); in ccdc_config()
691 ccdc->update |= OMAP3ISP_CCDC_BLCLAMP; in ccdc_config()
695 if (copy_from_user(&ccdc->blcomp, ccdc_struct->blcomp, in ccdc_config()
696 sizeof(ccdc->blcomp))) { in ccdc_config()
697 ccdc->shadow_update = 0; in ccdc_config()
701 ccdc->update |= OMAP3ISP_CCDC_BCOMP; in ccdc_config()
704 ccdc->shadow_update = 0; in ccdc_config()
712 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED) in ccdc_config()
715 ccdc->fpc_en = !!(OMAP3ISP_CCDC_FPC & ccdc_struct->flag); in ccdc_config()
717 if (ccdc->fpc_en) { in ccdc_config()
742 fpc_old = ccdc->fpc; in ccdc_config()
743 ccdc->fpc = fpc_new; in ccdc_config()
746 ccdc_configure_fpc(ccdc); in ccdc_config()
753 return ccdc_lsc_config(ccdc, ccdc_struct); in ccdc_config()
756 static void ccdc_apply_controls(struct isp_ccdc_device *ccdc) in ccdc_apply_controls() argument
758 if (ccdc->update & OMAP3ISP_CCDC_ALAW) { in ccdc_apply_controls()
759 ccdc_configure_alaw(ccdc); in ccdc_apply_controls()
760 ccdc->update &= ~OMAP3ISP_CCDC_ALAW; in ccdc_apply_controls()
763 if (ccdc->update & OMAP3ISP_CCDC_LPF) { in ccdc_apply_controls()
764 ccdc_configure_lpf(ccdc); in ccdc_apply_controls()
765 ccdc->update &= ~OMAP3ISP_CCDC_LPF; in ccdc_apply_controls()
768 if (ccdc->update & OMAP3ISP_CCDC_BLCLAMP) { in ccdc_apply_controls()
769 ccdc_configure_clamp(ccdc); in ccdc_apply_controls()
770 ccdc->update &= ~OMAP3ISP_CCDC_BLCLAMP; in ccdc_apply_controls()
773 if (ccdc->update & OMAP3ISP_CCDC_BCOMP) { in ccdc_apply_controls()
774 ccdc_configure_black_comp(ccdc); in ccdc_apply_controls()
775 ccdc->update &= ~OMAP3ISP_CCDC_BCOMP; in ccdc_apply_controls()
785 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_restore_context() local
789 ccdc->update = OMAP3ISP_CCDC_ALAW | OMAP3ISP_CCDC_LPF in omap3isp_ccdc_restore_context()
791 ccdc_apply_controls(ccdc); in omap3isp_ccdc_restore_context()
792 ccdc_configure_fpc(ccdc); in omap3isp_ccdc_restore_context()
803 static void ccdc_config_vp(struct isp_ccdc_device *ccdc) in ccdc_config_vp() argument
805 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_config_vp()
806 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_vp()
814 format = &ccdc->formats[CCDC_PAD_SOURCE_VP]; in ccdc_config_vp()
835 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code); in ccdc_config_vp()
884 static void ccdc_config_outlineoffset(struct isp_ccdc_device *ccdc, in ccdc_config_outlineoffset() argument
888 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_outlineoffset()
921 static void ccdc_set_outaddr(struct isp_ccdc_device *ccdc, u32 addr) in ccdc_set_outaddr() argument
923 struct isp_device *isp = to_isp_device(ccdc); in ccdc_set_outaddr()
935 void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc, in omap3isp_ccdc_max_rate() argument
938 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in omap3isp_ccdc_max_rate()
948 if (ccdc->input == CCDC_INPUT_PARALLEL) in omap3isp_ccdc_max_rate()
962 static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc, in ccdc_config_sync_if() argument
966 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_sync_if()
970 format = &ccdc->formats[CCDC_PAD_SINK]; in ccdc_config_sync_if()
980 if (ccdc->bt656) in ccdc_config_sync_if()
1010 if ((parcfg && parcfg->vs_pol) || ccdc->bt656) in ccdc_config_sync_if()
1031 if (ccdc->bt656) in ccdc_config_sync_if()
1113 static void ccdc_configure(struct isp_ccdc_device *ccdc) in ccdc_configure() argument
1115 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure()
1133 ccdc->bt656 = false; in ccdc_configure()
1134 ccdc->fields = 0; in ccdc_configure()
1136 pad = media_pad_remote_pad_first(&ccdc->pads[CCDC_PAD_SINK]); in ccdc_configure()
1138 if (ccdc->input == CCDC_INPUT_PARALLEL) { in ccdc_configure()
1140 to_isp_pipeline(&ccdc->subdev.entity)->external; in ccdc_configure()
1143 ccdc->bt656 = parcfg->bt656; in ccdc_configure()
1147 format = &ccdc->formats[CCDC_PAD_SINK]; in ccdc_configure()
1163 if (ccdc->bt656) in ccdc_configure()
1172 omap3isp_configure_bridge(isp, ccdc->input, parcfg, shift, bridge); in ccdc_configure()
1175 ccdc_config_sync_if(ccdc, parcfg, depth_out); in ccdc_configure()
1184 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_configure()
1189 if (ccdc->output & CCDC_OUTPUT_RESIZER) in ccdc_configure()
1213 ccdc_config_imgattr(ccdc, ccdc_pattern); in ccdc_configure()
1223 format = &ccdc->formats[CCDC_PAD_SOURCE_OF]; in ccdc_configure()
1224 crop = &ccdc->crop; in ccdc_configure()
1231 if (ccdc->bt656) { in ccdc_configure()
1249 ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value, in ccdc_configure()
1256 if (ccdc->formats[CCDC_PAD_SINK].field == V4L2_FIELD_ALTERNATE && in ccdc_configure()
1275 if (omap3isp_video_format_info(format->code)->width <= 8 || ccdc->bt656) in ccdc_configure()
1283 ccdc_config_vp(ccdc); in ccdc_configure()
1286 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_configure()
1287 if (ccdc->lsc.request == NULL) in ccdc_configure()
1290 WARN_ON(ccdc->lsc.active); in ccdc_configure()
1295 if (ccdc->lsc.active == NULL && in ccdc_configure()
1296 __ccdc_lsc_configure(ccdc, ccdc->lsc.request) == 0) { in ccdc_configure()
1297 ccdc->lsc.active = ccdc->lsc.request; in ccdc_configure()
1299 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue); in ccdc_configure()
1300 schedule_work(&ccdc->lsc.table_work); in ccdc_configure()
1303 ccdc->lsc.request = NULL; in ccdc_configure()
1306 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_configure()
1308 ccdc_apply_controls(ccdc); in ccdc_configure()
1311 static void __ccdc_enable(struct isp_ccdc_device *ccdc, int enable) in __ccdc_enable() argument
1313 struct isp_device *isp = to_isp_device(ccdc); in __ccdc_enable()
1316 if (enable && ccdc->stopping & CCDC_STOP_REQUEST) in __ccdc_enable()
1322 ccdc->running = enable; in __ccdc_enable()
1325 static int ccdc_disable(struct isp_ccdc_device *ccdc) in ccdc_disable() argument
1330 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_disable()
1331 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS) in ccdc_disable()
1332 ccdc->stopping = CCDC_STOP_REQUEST; in ccdc_disable()
1333 if (!ccdc->running) in ccdc_disable()
1334 ccdc->stopping = CCDC_STOP_FINISHED; in ccdc_disable()
1335 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_disable()
1337 ret = wait_event_timeout(ccdc->wait, in ccdc_disable()
1338 ccdc->stopping == CCDC_STOP_FINISHED, in ccdc_disable()
1342 dev_warn(to_device(ccdc), "CCDC stop timeout!\n"); in ccdc_disable()
1345 omap3isp_sbl_disable(to_isp_device(ccdc), OMAP3_ISP_SBL_CCDC_LSC_READ); in ccdc_disable()
1347 mutex_lock(&ccdc->ioctl_lock); in ccdc_disable()
1348 ccdc_lsc_free_request(ccdc, ccdc->lsc.request); in ccdc_disable()
1349 ccdc->lsc.request = ccdc->lsc.active; in ccdc_disable()
1350 ccdc->lsc.active = NULL; in ccdc_disable()
1351 cancel_work_sync(&ccdc->lsc.table_work); in ccdc_disable()
1352 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue); in ccdc_disable()
1353 mutex_unlock(&ccdc->ioctl_lock); in ccdc_disable()
1355 ccdc->stopping = CCDC_STOP_NOT_REQUESTED; in ccdc_disable()
1360 static void ccdc_enable(struct isp_ccdc_device *ccdc) in ccdc_enable() argument
1362 if (ccdc_lsc_is_configured(ccdc)) in ccdc_enable()
1363 __ccdc_lsc_enable(ccdc, 1); in ccdc_enable()
1364 __ccdc_enable(ccdc, 1); in ccdc_enable()
1378 static int ccdc_sbl_busy(struct isp_ccdc_device *ccdc) in ccdc_sbl_busy() argument
1380 struct isp_device *isp = to_isp_device(ccdc); in ccdc_sbl_busy()
1382 return omap3isp_ccdc_busy(ccdc) in ccdc_sbl_busy()
1398 static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc, in ccdc_sbl_wait_idle() argument
1407 if (!ccdc_sbl_busy(ccdc)) in ccdc_sbl_wait_idle()
1424 static int ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) in ccdc_handle_stopping() argument
1428 switch ((ccdc->stopping & 3) | event) { in ccdc_handle_stopping()
1430 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_handle_stopping()
1431 __ccdc_lsc_enable(ccdc, 0); in ccdc_handle_stopping()
1432 __ccdc_enable(ccdc, 0); in ccdc_handle_stopping()
1433 ccdc->stopping = CCDC_STOP_EXECUTED; in ccdc_handle_stopping()
1437 ccdc->stopping |= CCDC_STOP_CCDC_FINISHED; in ccdc_handle_stopping()
1438 if (ccdc->lsc.state == LSC_STATE_STOPPED) in ccdc_handle_stopping()
1439 ccdc->stopping |= CCDC_STOP_LSC_FINISHED; in ccdc_handle_stopping()
1444 ccdc->stopping |= CCDC_STOP_LSC_FINISHED; in ccdc_handle_stopping()
1452 if (ccdc->stopping == CCDC_STOP_FINISHED) { in ccdc_handle_stopping()
1453 wake_up(&ccdc->wait); in ccdc_handle_stopping()
1460 static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) in ccdc_hs_vs_isr() argument
1462 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_hs_vs_isr()
1463 struct video_device *vdev = ccdc->subdev.devnode; in ccdc_hs_vs_isr()
1481 static void ccdc_lsc_isr(struct isp_ccdc_device *ccdc, u32 events) in ccdc_lsc_isr() argument
1487 to_isp_pipeline(&ccdc->subdev.entity); in ccdc_lsc_isr()
1489 ccdc_lsc_error_handler(ccdc); in ccdc_lsc_isr()
1491 dev_dbg(to_device(ccdc), "lsc prefetch error\n"); in ccdc_lsc_isr()
1501 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_isr()
1503 if (ccdc->lsc.state == LSC_STATE_STOPPING) in ccdc_lsc_isr()
1504 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_isr()
1506 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_LSC_DONE)) in ccdc_lsc_isr()
1509 if (ccdc->lsc.state != LSC_STATE_RECONFIG) in ccdc_lsc_isr()
1513 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_isr()
1525 if (ccdc->lsc.request == NULL) in ccdc_lsc_isr()
1528 ccdc_lsc_enable(ccdc); in ccdc_lsc_isr()
1531 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_isr()
1538 static bool ccdc_has_all_fields(struct isp_ccdc_device *ccdc) in ccdc_has_all_fields() argument
1540 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_has_all_fields()
1541 struct isp_device *isp = to_isp_device(ccdc); in ccdc_has_all_fields()
1542 enum v4l2_field of_field = ccdc->formats[CCDC_PAD_SOURCE_OF].field; in ccdc_has_all_fields()
1563 ccdc->fields |= field == V4L2_FIELD_BOTTOM in ccdc_has_all_fields()
1566 if (ccdc->fields != CCDC_FIELD_BOTH) in ccdc_has_all_fields()
1577 ccdc->fields = 0; in ccdc_has_all_fields()
1582 static int ccdc_isr_buffer(struct isp_ccdc_device *ccdc) in ccdc_isr_buffer() argument
1584 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_isr_buffer()
1585 struct isp_device *isp = to_isp_device(ccdc); in ccdc_isr_buffer()
1594 if (list_empty(&ccdc->video_out.dmaqueue)) in ccdc_isr_buffer()
1601 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && ccdc->underrun) { in ccdc_isr_buffer()
1602 ccdc->underrun = 0; in ccdc_isr_buffer()
1607 if (ccdc_sbl_wait_idle(ccdc, 1000)) { in ccdc_isr_buffer()
1609 media_entity_enum_set(&isp->crashed, &ccdc->subdev.entity); in ccdc_isr_buffer()
1615 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && in ccdc_isr_buffer()
1616 ccdc->stopping & CCDC_STOP_REQUEST) in ccdc_isr_buffer()
1619 if (!ccdc_has_all_fields(ccdc)) in ccdc_isr_buffer()
1622 buffer = omap3isp_video_buffer_next(&ccdc->video_out); in ccdc_isr_buffer()
1624 ccdc_set_outaddr(ccdc, buffer->dma); in ccdc_isr_buffer()
1628 if (ccdc->state == ISP_PIPELINE_STREAM_SINGLESHOT && in ccdc_isr_buffer()
1642 static void ccdc_vd0_isr(struct isp_ccdc_device *ccdc) in ccdc_vd0_isr() argument
1650 if (ccdc->bt656) { in ccdc_vd0_isr()
1652 to_isp_pipeline(&ccdc->subdev.entity); in ccdc_vd0_isr()
1661 if (ccdc->bt656) { in ccdc_vd0_isr()
1662 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_vd0_isr()
1663 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && in ccdc_vd0_isr()
1664 ccdc->output & CCDC_OUTPUT_MEMORY) { in ccdc_vd0_isr()
1665 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_vd0_isr()
1666 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd0_isr()
1667 __ccdc_enable(ccdc, 0); in ccdc_vd0_isr()
1669 ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1); in ccdc_vd0_isr()
1670 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1673 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_vd0_isr()
1674 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) { in ccdc_vd0_isr()
1675 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1679 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_vd0_isr()
1680 restart = ccdc_isr_buffer(ccdc); in ccdc_vd0_isr()
1682 if (!ccdc->shadow_update) in ccdc_vd0_isr()
1683 ccdc_apply_controls(ccdc); in ccdc_vd0_isr()
1684 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1687 ccdc_enable(ccdc); in ccdc_vd0_isr()
1694 static void ccdc_vd1_isr(struct isp_ccdc_device *ccdc) in ccdc_vd1_isr() argument
1707 if (ccdc->bt656) in ccdc_vd1_isr()
1710 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_vd1_isr()
1722 switch (ccdc->state) { in ccdc_vd1_isr()
1724 ccdc->stopping = CCDC_STOP_REQUEST; in ccdc_vd1_isr()
1728 if (ccdc->output & CCDC_OUTPUT_MEMORY) { in ccdc_vd1_isr()
1729 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_vd1_isr()
1730 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd1_isr()
1731 __ccdc_enable(ccdc, 0); in ccdc_vd1_isr()
1739 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1)) in ccdc_vd1_isr()
1742 if (ccdc->lsc.request == NULL) in ccdc_vd1_isr()
1749 if (ccdc->lsc.state == LSC_STATE_RUNNING) { in ccdc_vd1_isr()
1750 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd1_isr()
1751 ccdc->lsc.state = LSC_STATE_RECONFIG; in ccdc_vd1_isr()
1756 if (ccdc->lsc.state == LSC_STATE_STOPPED) in ccdc_vd1_isr()
1757 ccdc_lsc_enable(ccdc); in ccdc_vd1_isr()
1760 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_vd1_isr()
1768 int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc, u32 events) in omap3isp_ccdc_isr() argument
1770 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) in omap3isp_ccdc_isr()
1774 ccdc_vd1_isr(ccdc); in omap3isp_ccdc_isr()
1776 ccdc_lsc_isr(ccdc, events); in omap3isp_ccdc_isr()
1779 ccdc_vd0_isr(ccdc); in omap3isp_ccdc_isr()
1782 ccdc_hs_vs_isr(ccdc); in omap3isp_ccdc_isr()
1793 struct isp_ccdc_device *ccdc = &video->isp->isp_ccdc; in ccdc_video_queue() local
1797 if (!(ccdc->output & CCDC_OUTPUT_MEMORY)) in ccdc_video_queue()
1800 ccdc_set_outaddr(ccdc, buffer->dma); in ccdc_video_queue()
1808 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_video_queue()
1809 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && !ccdc->running && in ccdc_video_queue()
1810 ccdc->bt656) in ccdc_video_queue()
1813 ccdc->underrun = 1; in ccdc_video_queue()
1814 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_video_queue()
1817 ccdc_enable(ccdc); in ccdc_video_queue()
1840 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_ioctl() local
1845 mutex_lock(&ccdc->ioctl_lock); in ccdc_ioctl()
1846 ret = ccdc_config(ccdc, arg); in ccdc_ioctl()
1847 mutex_unlock(&ccdc->ioctl_lock); in ccdc_ioctl()
1890 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_stream() local
1891 struct isp_device *isp = to_isp_device(ccdc); in ccdc_set_stream()
1894 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) { in ccdc_set_stream()
1902 ccdc_configure(ccdc); in ccdc_set_stream()
1904 ccdc_print_status(ccdc); in ccdc_set_stream()
1909 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_set_stream()
1912 if (ccdc->underrun || !(ccdc->output & CCDC_OUTPUT_MEMORY)) in ccdc_set_stream()
1913 ccdc_enable(ccdc); in ccdc_set_stream()
1915 ccdc->underrun = 0; in ccdc_set_stream()
1919 if (ccdc->output & CCDC_OUTPUT_MEMORY && in ccdc_set_stream()
1920 ccdc->state != ISP_PIPELINE_STREAM_SINGLESHOT) in ccdc_set_stream()
1923 ccdc_enable(ccdc); in ccdc_set_stream()
1927 ret = ccdc_disable(ccdc); in ccdc_set_stream()
1928 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_set_stream()
1931 ccdc->underrun = 0; in ccdc_set_stream()
1935 ccdc->state = enable; in ccdc_set_stream()
1940 __ccdc_get_format(struct isp_ccdc_device *ccdc, in __ccdc_get_format() argument
1945 return v4l2_subdev_get_try_format(&ccdc->subdev, sd_state, in __ccdc_get_format()
1948 return &ccdc->formats[pad]; in __ccdc_get_format()
1952 __ccdc_get_crop(struct isp_ccdc_device *ccdc, in __ccdc_get_crop() argument
1957 return v4l2_subdev_get_try_crop(&ccdc->subdev, sd_state, in __ccdc_get_crop()
1960 return &ccdc->crop; in __ccdc_get_crop()
1971 ccdc_try_format(struct isp_ccdc_device *ccdc, in ccdc_try_format() argument
2008 *fmt = *__ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK, in ccdc_try_format()
2034 crop = __ccdc_get_crop(ccdc, sd_state, which); in ccdc_try_format()
2051 *fmt = *__ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK, in ccdc_try_format()
2084 static void ccdc_try_crop(struct isp_ccdc_device *ccdc, in ccdc_try_crop() argument
2132 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_enum_mbus_code() local
2144 format = __ccdc_get_format(ccdc, sd_state, code->pad, in ccdc_enum_mbus_code()
2175 format = __ccdc_get_format(ccdc, sd_state, code->pad, in ccdc_enum_mbus_code()
2198 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_enum_frame_size() local
2207 ccdc_try_format(ccdc, sd_state, fse->pad, &format, fse->which); in ccdc_enum_frame_size()
2217 ccdc_try_format(ccdc, sd_state, fse->pad, &format, fse->which); in ccdc_enum_frame_size()
2239 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_get_selection() local
2252 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK, in ccdc_get_selection()
2254 ccdc_try_crop(ccdc, format, &sel->r); in ccdc_get_selection()
2258 sel->r = *__ccdc_get_crop(ccdc, sd_state, sel->which); in ccdc_get_selection()
2283 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_selection() local
2291 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED) in ccdc_set_selection()
2299 sel->r = *__ccdc_get_crop(ccdc, sd_state, sel->which); in ccdc_set_selection()
2303 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SINK, sel->which); in ccdc_set_selection()
2304 ccdc_try_crop(ccdc, format, &sel->r); in ccdc_set_selection()
2305 *__ccdc_get_crop(ccdc, sd_state, sel->which) = sel->r; in ccdc_set_selection()
2308 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF, in ccdc_set_selection()
2310 ccdc_try_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF, format, in ccdc_set_selection()
2329 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_get_format() local
2332 format = __ccdc_get_format(ccdc, sd_state, fmt->pad, fmt->which); in ccdc_get_format()
2353 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_format() local
2357 format = __ccdc_get_format(ccdc, sd_state, fmt->pad, fmt->which); in ccdc_set_format()
2361 ccdc_try_format(ccdc, sd_state, fmt->pad, &fmt->format, fmt->which); in ccdc_set_format()
2367 crop = __ccdc_get_crop(ccdc, sd_state, fmt->which); in ccdc_set_format()
2373 ccdc_try_crop(ccdc, &fmt->format, crop); in ccdc_set_format()
2376 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF, in ccdc_set_format()
2379 ccdc_try_format(ccdc, sd_state, CCDC_PAD_SOURCE_OF, format, in ccdc_set_format()
2382 format = __ccdc_get_format(ccdc, sd_state, CCDC_PAD_SOURCE_VP, in ccdc_set_format()
2385 ccdc_try_format(ccdc, sd_state, CCDC_PAD_SOURCE_VP, format, in ccdc_set_format()
2426 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_link_validate() local
2435 if (ccdc->input == CCDC_INPUT_PARALLEL) { in ccdc_link_validate()
2530 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_link_setup() local
2531 struct isp_device *isp = to_isp_device(ccdc); in ccdc_link_setup()
2544 ccdc->input = CCDC_INPUT_NONE; in ccdc_link_setup()
2548 if (ccdc->input != CCDC_INPUT_NONE) in ccdc_link_setup()
2552 ccdc->input = CCDC_INPUT_CCP2B; in ccdc_link_setup()
2554 ccdc->input = CCDC_INPUT_CSI2A; in ccdc_link_setup()
2556 ccdc->input = CCDC_INPUT_CSI2C; in ccdc_link_setup()
2558 ccdc->input = CCDC_INPUT_PARALLEL; in ccdc_link_setup()
2572 if (ccdc->output & ~CCDC_OUTPUT_PREVIEW) in ccdc_link_setup()
2574 ccdc->output |= CCDC_OUTPUT_PREVIEW; in ccdc_link_setup()
2576 ccdc->output &= ~CCDC_OUTPUT_PREVIEW; in ccdc_link_setup()
2583 if (ccdc->output & ~CCDC_OUTPUT_MEMORY) in ccdc_link_setup()
2585 ccdc->output |= CCDC_OUTPUT_MEMORY; in ccdc_link_setup()
2587 ccdc->output &= ~CCDC_OUTPUT_MEMORY; in ccdc_link_setup()
2594 if (ccdc->output & ~CCDC_OUTPUT_RESIZER) in ccdc_link_setup()
2596 ccdc->output |= CCDC_OUTPUT_RESIZER; in ccdc_link_setup()
2598 ccdc->output &= ~CCDC_OUTPUT_RESIZER; in ccdc_link_setup()
2615 void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc) in omap3isp_ccdc_unregister_entities() argument
2617 v4l2_device_unregister_subdev(&ccdc->subdev); in omap3isp_ccdc_unregister_entities()
2618 omap3isp_video_unregister(&ccdc->video_out); in omap3isp_ccdc_unregister_entities()
2621 int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, in omap3isp_ccdc_register_entities() argument
2627 ccdc->subdev.dev = vdev->mdev->dev; in omap3isp_ccdc_register_entities()
2628 ret = v4l2_device_register_subdev(vdev, &ccdc->subdev); in omap3isp_ccdc_register_entities()
2632 ret = omap3isp_video_register(&ccdc->video_out, vdev); in omap3isp_ccdc_register_entities()
2639 omap3isp_ccdc_unregister_entities(ccdc); in omap3isp_ccdc_register_entities()
2653 static int ccdc_init_entities(struct isp_ccdc_device *ccdc) in ccdc_init_entities() argument
2655 struct v4l2_subdev *sd = &ccdc->subdev; in ccdc_init_entities()
2656 struct media_pad *pads = ccdc->pads; in ccdc_init_entities()
2660 ccdc->input = CCDC_INPUT_NONE; in ccdc_init_entities()
2666 v4l2_set_subdevdata(sd, ccdc); in ccdc_init_entities()
2681 ccdc->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in ccdc_init_entities()
2682 ccdc->video_out.ops = &ccdc_video_ops; in ccdc_init_entities()
2683 ccdc->video_out.isp = to_isp_device(ccdc); in ccdc_init_entities()
2684 ccdc->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; in ccdc_init_entities()
2685 ccdc->video_out.bpl_alignment = 32; in ccdc_init_entities()
2687 ret = omap3isp_video_init(&ccdc->video_out, "CCDC"); in ccdc_init_entities()
2708 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_init() local
2711 spin_lock_init(&ccdc->lock); in omap3isp_ccdc_init()
2712 init_waitqueue_head(&ccdc->wait); in omap3isp_ccdc_init()
2713 mutex_init(&ccdc->ioctl_lock); in omap3isp_ccdc_init()
2715 ccdc->stopping = CCDC_STOP_NOT_REQUESTED; in omap3isp_ccdc_init()
2717 INIT_WORK(&ccdc->lsc.table_work, ccdc_lsc_free_table_work); in omap3isp_ccdc_init()
2718 ccdc->lsc.state = LSC_STATE_STOPPED; in omap3isp_ccdc_init()
2719 INIT_LIST_HEAD(&ccdc->lsc.free_queue); in omap3isp_ccdc_init()
2720 spin_lock_init(&ccdc->lsc.req_lock); in omap3isp_ccdc_init()
2722 ccdc->clamp.oblen = 0; in omap3isp_ccdc_init()
2723 ccdc->clamp.dcsubval = 0; in omap3isp_ccdc_init()
2725 ccdc->update = OMAP3ISP_CCDC_BLCLAMP; in omap3isp_ccdc_init()
2726 ccdc_apply_controls(ccdc); in omap3isp_ccdc_init()
2728 ret = ccdc_init_entities(ccdc); in omap3isp_ccdc_init()
2730 mutex_destroy(&ccdc->ioctl_lock); in omap3isp_ccdc_init()
2743 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_cleanup() local
2745 omap3isp_video_cleanup(&ccdc->video_out); in omap3isp_ccdc_cleanup()
2746 media_entity_cleanup(&ccdc->subdev.entity); in omap3isp_ccdc_cleanup()
2751 ccdc_lsc_free_request(ccdc, ccdc->lsc.request); in omap3isp_ccdc_cleanup()
2752 cancel_work_sync(&ccdc->lsc.table_work); in omap3isp_ccdc_cleanup()
2753 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue); in omap3isp_ccdc_cleanup()
2755 if (ccdc->fpc.addr != NULL) in omap3isp_ccdc_cleanup()
2756 dma_free_coherent(isp->dev, ccdc->fpc.fpnum * 4, ccdc->fpc.addr, in omap3isp_ccdc_cleanup()
2757 ccdc->fpc.dma); in omap3isp_ccdc_cleanup()
2759 mutex_destroy(&ccdc->ioctl_lock); in omap3isp_ccdc_cleanup()