Lines Matching refs:ccdc

35 __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg,
68 static void ccdc_print_status(struct isp_ccdc_device *ccdc) in ccdc_print_status() argument
70 struct isp_device *isp = to_isp_device(ccdc); in ccdc_print_status()
115 int omap3isp_ccdc_busy(struct isp_ccdc_device *ccdc) in omap3isp_ccdc_busy() argument
117 struct isp_device *isp = to_isp_device(ccdc); in omap3isp_ccdc_busy()
134 static int ccdc_lsc_validate_config(struct isp_ccdc_device *ccdc, in ccdc_lsc_validate_config() argument
137 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_validate_config()
164 format = __ccdc_get_format(ccdc, NULL, CCDC_PAD_SINK, in ccdc_lsc_validate_config()
198 static void ccdc_lsc_program_table(struct isp_ccdc_device *ccdc, in ccdc_lsc_program_table() argument
201 isp_reg_writel(to_isp_device(ccdc), addr, in ccdc_lsc_program_table()
209 static void ccdc_lsc_setup_regs(struct isp_ccdc_device *ccdc, in ccdc_lsc_setup_regs() argument
212 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_setup_regs()
233 static int ccdc_lsc_wait_prefetch(struct isp_ccdc_device *ccdc) in ccdc_lsc_wait_prefetch() argument
235 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_wait_prefetch()
262 static int __ccdc_lsc_enable(struct isp_ccdc_device *ccdc, int enable) in __ccdc_lsc_enable() argument
264 struct isp_device *isp = to_isp_device(ccdc); in __ccdc_lsc_enable()
266 __ccdc_get_format(ccdc, NULL, CCDC_PAD_SINK, in __ccdc_lsc_enable()
282 if (ccdc_lsc_wait_prefetch(ccdc) < 0) { in __ccdc_lsc_enable()
285 ccdc->lsc.state = LSC_STATE_STOPPED; in __ccdc_lsc_enable()
286 dev_warn(to_device(ccdc), "LSC prefetch timeout\n"); in __ccdc_lsc_enable()
289 ccdc->lsc.state = LSC_STATE_RUNNING; in __ccdc_lsc_enable()
291 ccdc->lsc.state = LSC_STATE_STOPPING; in __ccdc_lsc_enable()
297 static int ccdc_lsc_busy(struct isp_ccdc_device *ccdc) in ccdc_lsc_busy() argument
299 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_busy()
311 static int __ccdc_lsc_configure(struct isp_ccdc_device *ccdc, in __ccdc_lsc_configure() argument
317 if (ccdc_lsc_validate_config(ccdc, &req->config) < 0) { in __ccdc_lsc_configure()
318 dev_dbg(to_device(ccdc), "Discard LSC configuration\n"); in __ccdc_lsc_configure()
322 if (ccdc_lsc_busy(ccdc)) in __ccdc_lsc_configure()
325 ccdc_lsc_setup_regs(ccdc, &req->config); in __ccdc_lsc_configure()
326 ccdc_lsc_program_table(ccdc, req->table.dma); in __ccdc_lsc_configure()
336 static void ccdc_lsc_error_handler(struct isp_ccdc_device *ccdc) in ccdc_lsc_error_handler() argument
338 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_error_handler()
350 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_error_handler()
353 static void ccdc_lsc_free_request(struct isp_ccdc_device *ccdc, in ccdc_lsc_free_request() argument
356 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_free_request()
370 static void ccdc_lsc_free_queue(struct isp_ccdc_device *ccdc, in ccdc_lsc_free_queue() argument
376 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
379 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
380 ccdc_lsc_free_request(ccdc, req); in ccdc_lsc_free_queue()
381 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
383 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_free_queue()
388 struct isp_ccdc_device *ccdc; in ccdc_lsc_free_table_work() local
392 ccdc = container_of(lsc, struct isp_ccdc_device, lsc); in ccdc_lsc_free_table_work()
394 ccdc_lsc_free_queue(ccdc, &lsc->free_queue); in ccdc_lsc_free_table_work()
404 static int ccdc_lsc_config(struct isp_ccdc_device *ccdc, in ccdc_lsc_config() argument
407 struct isp_device *isp = to_isp_device(ccdc); in ccdc_lsc_config()
419 dev_dbg(to_device(ccdc), in ccdc_lsc_config()
465 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_config()
466 if (ccdc->lsc.request) { in ccdc_lsc_config()
467 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue); in ccdc_lsc_config()
468 schedule_work(&ccdc->lsc.table_work); in ccdc_lsc_config()
470 ccdc->lsc.request = req; in ccdc_lsc_config()
471 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_config()
477 ccdc_lsc_free_request(ccdc, req); in ccdc_lsc_config()
482 static inline int ccdc_lsc_is_configured(struct isp_ccdc_device *ccdc) in ccdc_lsc_is_configured() argument
487 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_is_configured()
488 ret = ccdc->lsc.active != NULL; in ccdc_lsc_is_configured()
489 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_is_configured()
494 static int ccdc_lsc_enable(struct isp_ccdc_device *ccdc) in ccdc_lsc_enable() argument
496 struct ispccdc_lsc *lsc = &ccdc->lsc; in ccdc_lsc_enable()
506 if (__ccdc_lsc_configure(ccdc, lsc->request) < 0) { in ccdc_lsc_enable()
507 omap3isp_sbl_disable(to_isp_device(ccdc), in ccdc_lsc_enable()
516 __ccdc_lsc_enable(ccdc, 1); in ccdc_lsc_enable()
536 static void ccdc_configure_clamp(struct isp_ccdc_device *ccdc) in ccdc_configure_clamp() argument
538 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_clamp()
541 if (ccdc->obclamp) { in ccdc_configure_clamp()
542 clamp = ccdc->clamp.obgain << ISPCCDC_CLAMP_OBGAIN_SHIFT; in ccdc_configure_clamp()
543 clamp |= ccdc->clamp.oblen << ISPCCDC_CLAMP_OBSLEN_SHIFT; in ccdc_configure_clamp()
544 clamp |= ccdc->clamp.oblines << ISPCCDC_CLAMP_OBSLN_SHIFT; in ccdc_configure_clamp()
545 clamp |= ccdc->clamp.obstpixel << ISPCCDC_CLAMP_OBST_SHIFT; in ccdc_configure_clamp()
548 isp_reg_writel(isp, ccdc->clamp.dcsubval, in ccdc_configure_clamp()
554 ccdc->obclamp ? ISPCCDC_CLAMP_CLAMPEN : 0); in ccdc_configure_clamp()
561 static void ccdc_configure_fpc(struct isp_ccdc_device *ccdc) in ccdc_configure_fpc() argument
563 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_fpc()
567 if (!ccdc->fpc_en) in ccdc_configure_fpc()
570 isp_reg_writel(isp, ccdc->fpc.dma, OMAP3_ISP_IOMEM_CCDC, in ccdc_configure_fpc()
573 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT), in ccdc_configure_fpc()
575 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT) | in ccdc_configure_fpc()
583 static void ccdc_configure_black_comp(struct isp_ccdc_device *ccdc) in ccdc_configure_black_comp() argument
585 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_black_comp()
588 blcomp = ccdc->blcomp.b_mg << ISPCCDC_BLKCMP_B_MG_SHIFT; in ccdc_configure_black_comp()
589 blcomp |= ccdc->blcomp.gb_g << ISPCCDC_BLKCMP_GB_G_SHIFT; in ccdc_configure_black_comp()
590 blcomp |= ccdc->blcomp.gr_cy << ISPCCDC_BLKCMP_GR_CY_SHIFT; in ccdc_configure_black_comp()
591 blcomp |= ccdc->blcomp.r_ye << ISPCCDC_BLKCMP_R_YE_SHIFT; in ccdc_configure_black_comp()
600 static void ccdc_configure_lpf(struct isp_ccdc_device *ccdc) in ccdc_configure_lpf() argument
602 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_lpf()
606 ccdc->lpf ? ISPCCDC_SYN_MODE_LPF : 0); in ccdc_configure_lpf()
613 static void ccdc_configure_alaw(struct isp_ccdc_device *ccdc) in ccdc_configure_alaw() argument
615 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_alaw()
619 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code); in ccdc_configure_alaw()
639 if (ccdc->alaw) in ccdc_configure_alaw()
650 static void ccdc_config_imgattr(struct isp_ccdc_device *ccdc, u32 colptn) in ccdc_config_imgattr() argument
652 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_imgattr()
666 static int ccdc_config(struct isp_ccdc_device *ccdc, in ccdc_config() argument
669 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config()
672 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_config()
673 ccdc->shadow_update = 1; in ccdc_config()
674 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_config()
677 ccdc->alaw = !!(OMAP3ISP_CCDC_ALAW & ccdc_struct->flag); in ccdc_config()
678 ccdc->update |= OMAP3ISP_CCDC_ALAW; in ccdc_config()
682 ccdc->lpf = !!(OMAP3ISP_CCDC_LPF & ccdc_struct->flag); in ccdc_config()
683 ccdc->update |= OMAP3ISP_CCDC_LPF; in ccdc_config()
687 if (copy_from_user(&ccdc->clamp, ccdc_struct->bclamp, in ccdc_config()
688 sizeof(ccdc->clamp))) { in ccdc_config()
689 ccdc->shadow_update = 0; in ccdc_config()
693 ccdc->obclamp = !!(OMAP3ISP_CCDC_BLCLAMP & ccdc_struct->flag); in ccdc_config()
694 ccdc->update |= OMAP3ISP_CCDC_BLCLAMP; in ccdc_config()
698 if (copy_from_user(&ccdc->blcomp, ccdc_struct->blcomp, in ccdc_config()
699 sizeof(ccdc->blcomp))) { in ccdc_config()
700 ccdc->shadow_update = 0; in ccdc_config()
704 ccdc->update |= OMAP3ISP_CCDC_BCOMP; in ccdc_config()
707 ccdc->shadow_update = 0; in ccdc_config()
715 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED) in ccdc_config()
718 ccdc->fpc_en = !!(OMAP3ISP_CCDC_FPC & ccdc_struct->flag); in ccdc_config()
720 if (ccdc->fpc_en) { in ccdc_config()
745 fpc_old = ccdc->fpc; in ccdc_config()
746 ccdc->fpc = fpc_new; in ccdc_config()
749 ccdc_configure_fpc(ccdc); in ccdc_config()
756 return ccdc_lsc_config(ccdc, ccdc_struct); in ccdc_config()
759 static void ccdc_apply_controls(struct isp_ccdc_device *ccdc) in ccdc_apply_controls() argument
761 if (ccdc->update & OMAP3ISP_CCDC_ALAW) { in ccdc_apply_controls()
762 ccdc_configure_alaw(ccdc); in ccdc_apply_controls()
763 ccdc->update &= ~OMAP3ISP_CCDC_ALAW; in ccdc_apply_controls()
766 if (ccdc->update & OMAP3ISP_CCDC_LPF) { in ccdc_apply_controls()
767 ccdc_configure_lpf(ccdc); in ccdc_apply_controls()
768 ccdc->update &= ~OMAP3ISP_CCDC_LPF; in ccdc_apply_controls()
771 if (ccdc->update & OMAP3ISP_CCDC_BLCLAMP) { in ccdc_apply_controls()
772 ccdc_configure_clamp(ccdc); in ccdc_apply_controls()
773 ccdc->update &= ~OMAP3ISP_CCDC_BLCLAMP; in ccdc_apply_controls()
776 if (ccdc->update & OMAP3ISP_CCDC_BCOMP) { in ccdc_apply_controls()
777 ccdc_configure_black_comp(ccdc); in ccdc_apply_controls()
778 ccdc->update &= ~OMAP3ISP_CCDC_BCOMP; in ccdc_apply_controls()
788 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_restore_context() local
792 ccdc->update = OMAP3ISP_CCDC_ALAW | OMAP3ISP_CCDC_LPF in omap3isp_ccdc_restore_context()
794 ccdc_apply_controls(ccdc); in omap3isp_ccdc_restore_context()
795 ccdc_configure_fpc(ccdc); in omap3isp_ccdc_restore_context()
806 static void ccdc_config_vp(struct isp_ccdc_device *ccdc) in ccdc_config_vp() argument
808 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_config_vp()
809 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_vp()
817 format = &ccdc->formats[CCDC_PAD_SOURCE_VP]; in ccdc_config_vp()
838 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code); in ccdc_config_vp()
887 static void ccdc_config_outlineoffset(struct isp_ccdc_device *ccdc, in ccdc_config_outlineoffset() argument
891 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_outlineoffset()
924 static void ccdc_set_outaddr(struct isp_ccdc_device *ccdc, u32 addr) in ccdc_set_outaddr() argument
926 struct isp_device *isp = to_isp_device(ccdc); in ccdc_set_outaddr()
938 void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc, in omap3isp_ccdc_max_rate() argument
941 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in omap3isp_ccdc_max_rate()
951 if (ccdc->input == CCDC_INPUT_PARALLEL) in omap3isp_ccdc_max_rate()
965 static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc, in ccdc_config_sync_if() argument
969 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_sync_if()
973 format = &ccdc->formats[CCDC_PAD_SINK]; in ccdc_config_sync_if()
983 if (ccdc->bt656) in ccdc_config_sync_if()
1013 if ((parcfg && parcfg->vs_pol) || ccdc->bt656) in ccdc_config_sync_if()
1034 if (ccdc->bt656) in ccdc_config_sync_if()
1116 static void ccdc_configure(struct isp_ccdc_device *ccdc) in ccdc_configure() argument
1118 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure()
1136 ccdc->bt656 = false; in ccdc_configure()
1137 ccdc->fields = 0; in ccdc_configure()
1139 pad = media_entity_remote_pad(&ccdc->pads[CCDC_PAD_SINK]); in ccdc_configure()
1141 if (ccdc->input == CCDC_INPUT_PARALLEL) { in ccdc_configure()
1143 to_isp_pipeline(&ccdc->subdev.entity)->external; in ccdc_configure()
1146 ccdc->bt656 = parcfg->bt656; in ccdc_configure()
1150 format = &ccdc->formats[CCDC_PAD_SINK]; in ccdc_configure()
1166 if (ccdc->bt656) in ccdc_configure()
1175 omap3isp_configure_bridge(isp, ccdc->input, parcfg, shift, bridge); in ccdc_configure()
1178 ccdc_config_sync_if(ccdc, parcfg, depth_out); in ccdc_configure()
1187 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_configure()
1192 if (ccdc->output & CCDC_OUTPUT_RESIZER) in ccdc_configure()
1216 ccdc_config_imgattr(ccdc, ccdc_pattern); in ccdc_configure()
1226 format = &ccdc->formats[CCDC_PAD_SOURCE_OF]; in ccdc_configure()
1227 crop = &ccdc->crop; in ccdc_configure()
1234 if (ccdc->bt656) { in ccdc_configure()
1252 ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value, in ccdc_configure()
1259 if (ccdc->formats[CCDC_PAD_SINK].field == V4L2_FIELD_ALTERNATE && in ccdc_configure()
1278 if (omap3isp_video_format_info(format->code)->width <= 8 || ccdc->bt656) in ccdc_configure()
1286 ccdc_config_vp(ccdc); in ccdc_configure()
1289 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_configure()
1290 if (ccdc->lsc.request == NULL) in ccdc_configure()
1293 WARN_ON(ccdc->lsc.active); in ccdc_configure()
1298 if (ccdc->lsc.active == NULL && in ccdc_configure()
1299 __ccdc_lsc_configure(ccdc, ccdc->lsc.request) == 0) { in ccdc_configure()
1300 ccdc->lsc.active = ccdc->lsc.request; in ccdc_configure()
1302 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue); in ccdc_configure()
1303 schedule_work(&ccdc->lsc.table_work); in ccdc_configure()
1306 ccdc->lsc.request = NULL; in ccdc_configure()
1309 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_configure()
1311 ccdc_apply_controls(ccdc); in ccdc_configure()
1314 static void __ccdc_enable(struct isp_ccdc_device *ccdc, int enable) in __ccdc_enable() argument
1316 struct isp_device *isp = to_isp_device(ccdc); in __ccdc_enable()
1321 ccdc->running = enable; in __ccdc_enable()
1324 static int ccdc_disable(struct isp_ccdc_device *ccdc) in ccdc_disable() argument
1329 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_disable()
1330 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS) in ccdc_disable()
1331 ccdc->stopping = CCDC_STOP_REQUEST; in ccdc_disable()
1332 if (!ccdc->running) in ccdc_disable()
1333 ccdc->stopping = CCDC_STOP_FINISHED; in ccdc_disable()
1334 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_disable()
1336 ret = wait_event_timeout(ccdc->wait, in ccdc_disable()
1337 ccdc->stopping == CCDC_STOP_FINISHED, in ccdc_disable()
1341 dev_warn(to_device(ccdc), "CCDC stop timeout!\n"); in ccdc_disable()
1344 omap3isp_sbl_disable(to_isp_device(ccdc), OMAP3_ISP_SBL_CCDC_LSC_READ); in ccdc_disable()
1346 mutex_lock(&ccdc->ioctl_lock); in ccdc_disable()
1347 ccdc_lsc_free_request(ccdc, ccdc->lsc.request); in ccdc_disable()
1348 ccdc->lsc.request = ccdc->lsc.active; in ccdc_disable()
1349 ccdc->lsc.active = NULL; in ccdc_disable()
1350 cancel_work_sync(&ccdc->lsc.table_work); in ccdc_disable()
1351 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue); in ccdc_disable()
1352 mutex_unlock(&ccdc->ioctl_lock); in ccdc_disable()
1354 ccdc->stopping = CCDC_STOP_NOT_REQUESTED; in ccdc_disable()
1359 static void ccdc_enable(struct isp_ccdc_device *ccdc) in ccdc_enable() argument
1361 if (ccdc_lsc_is_configured(ccdc)) in ccdc_enable()
1362 __ccdc_lsc_enable(ccdc, 1); in ccdc_enable()
1363 __ccdc_enable(ccdc, 1); in ccdc_enable()
1377 static int ccdc_sbl_busy(struct isp_ccdc_device *ccdc) in ccdc_sbl_busy() argument
1379 struct isp_device *isp = to_isp_device(ccdc); in ccdc_sbl_busy()
1381 return omap3isp_ccdc_busy(ccdc) in ccdc_sbl_busy()
1397 static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc, in ccdc_sbl_wait_idle() argument
1406 if (!ccdc_sbl_busy(ccdc)) in ccdc_sbl_wait_idle()
1423 static int ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) in ccdc_handle_stopping() argument
1427 switch ((ccdc->stopping & 3) | event) { in ccdc_handle_stopping()
1429 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_handle_stopping()
1430 __ccdc_lsc_enable(ccdc, 0); in ccdc_handle_stopping()
1431 __ccdc_enable(ccdc, 0); in ccdc_handle_stopping()
1432 ccdc->stopping = CCDC_STOP_EXECUTED; in ccdc_handle_stopping()
1436 ccdc->stopping |= CCDC_STOP_CCDC_FINISHED; in ccdc_handle_stopping()
1437 if (ccdc->lsc.state == LSC_STATE_STOPPED) in ccdc_handle_stopping()
1438 ccdc->stopping |= CCDC_STOP_LSC_FINISHED; in ccdc_handle_stopping()
1443 ccdc->stopping |= CCDC_STOP_LSC_FINISHED; in ccdc_handle_stopping()
1451 if (ccdc->stopping == CCDC_STOP_FINISHED) { in ccdc_handle_stopping()
1452 wake_up(&ccdc->wait); in ccdc_handle_stopping()
1459 static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) in ccdc_hs_vs_isr() argument
1461 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_hs_vs_isr()
1462 struct video_device *vdev = ccdc->subdev.devnode; in ccdc_hs_vs_isr()
1480 static void ccdc_lsc_isr(struct isp_ccdc_device *ccdc, u32 events) in ccdc_lsc_isr() argument
1486 to_isp_pipeline(&ccdc->subdev.entity); in ccdc_lsc_isr()
1488 ccdc_lsc_error_handler(ccdc); in ccdc_lsc_isr()
1490 dev_dbg(to_device(ccdc), "lsc prefetch error\n"); in ccdc_lsc_isr()
1500 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_isr()
1502 if (ccdc->lsc.state == LSC_STATE_STOPPING) in ccdc_lsc_isr()
1503 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_isr()
1505 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_LSC_DONE)) in ccdc_lsc_isr()
1508 if (ccdc->lsc.state != LSC_STATE_RECONFIG) in ccdc_lsc_isr()
1512 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_isr()
1524 if (ccdc->lsc.request == NULL) in ccdc_lsc_isr()
1527 ccdc_lsc_enable(ccdc); in ccdc_lsc_isr()
1530 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_isr()
1537 static bool ccdc_has_all_fields(struct isp_ccdc_device *ccdc) in ccdc_has_all_fields() argument
1539 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_has_all_fields()
1540 struct isp_device *isp = to_isp_device(ccdc); in ccdc_has_all_fields()
1541 enum v4l2_field of_field = ccdc->formats[CCDC_PAD_SOURCE_OF].field; in ccdc_has_all_fields()
1562 ccdc->fields |= field == V4L2_FIELD_BOTTOM in ccdc_has_all_fields()
1565 if (ccdc->fields != CCDC_FIELD_BOTH) in ccdc_has_all_fields()
1576 ccdc->fields = 0; in ccdc_has_all_fields()
1581 static int ccdc_isr_buffer(struct isp_ccdc_device *ccdc) in ccdc_isr_buffer() argument
1583 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_isr_buffer()
1584 struct isp_device *isp = to_isp_device(ccdc); in ccdc_isr_buffer()
1593 if (list_empty(&ccdc->video_out.dmaqueue)) in ccdc_isr_buffer()
1600 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && ccdc->underrun) { in ccdc_isr_buffer()
1601 ccdc->underrun = 0; in ccdc_isr_buffer()
1606 if (ccdc_sbl_wait_idle(ccdc, 1000)) { in ccdc_isr_buffer()
1608 media_entity_enum_set(&isp->crashed, &ccdc->subdev.entity); in ccdc_isr_buffer()
1613 if (!ccdc_has_all_fields(ccdc)) in ccdc_isr_buffer()
1616 buffer = omap3isp_video_buffer_next(&ccdc->video_out); in ccdc_isr_buffer()
1618 ccdc_set_outaddr(ccdc, buffer->dma); in ccdc_isr_buffer()
1622 if (ccdc->state == ISP_PIPELINE_STREAM_SINGLESHOT && in ccdc_isr_buffer()
1636 static void ccdc_vd0_isr(struct isp_ccdc_device *ccdc) in ccdc_vd0_isr() argument
1644 if (ccdc->bt656) { in ccdc_vd0_isr()
1646 to_isp_pipeline(&ccdc->subdev.entity); in ccdc_vd0_isr()
1655 if (ccdc->bt656) { in ccdc_vd0_isr()
1656 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_vd0_isr()
1657 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && in ccdc_vd0_isr()
1658 ccdc->output & CCDC_OUTPUT_MEMORY) { in ccdc_vd0_isr()
1659 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_vd0_isr()
1660 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd0_isr()
1661 __ccdc_enable(ccdc, 0); in ccdc_vd0_isr()
1663 ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1); in ccdc_vd0_isr()
1664 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1667 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_vd0_isr()
1668 restart = ccdc_isr_buffer(ccdc); in ccdc_vd0_isr()
1670 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_vd0_isr()
1672 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) { in ccdc_vd0_isr()
1673 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1677 if (!ccdc->shadow_update) in ccdc_vd0_isr()
1678 ccdc_apply_controls(ccdc); in ccdc_vd0_isr()
1679 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1682 ccdc_enable(ccdc); in ccdc_vd0_isr()
1689 static void ccdc_vd1_isr(struct isp_ccdc_device *ccdc) in ccdc_vd1_isr() argument
1702 if (ccdc->bt656) in ccdc_vd1_isr()
1705 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_vd1_isr()
1717 switch (ccdc->state) { in ccdc_vd1_isr()
1719 ccdc->stopping = CCDC_STOP_REQUEST; in ccdc_vd1_isr()
1723 if (ccdc->output & CCDC_OUTPUT_MEMORY) { in ccdc_vd1_isr()
1724 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_vd1_isr()
1725 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd1_isr()
1726 __ccdc_enable(ccdc, 0); in ccdc_vd1_isr()
1734 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1)) in ccdc_vd1_isr()
1737 if (ccdc->lsc.request == NULL) in ccdc_vd1_isr()
1744 if (ccdc->lsc.state == LSC_STATE_RUNNING) { in ccdc_vd1_isr()
1745 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd1_isr()
1746 ccdc->lsc.state = LSC_STATE_RECONFIG; in ccdc_vd1_isr()
1751 if (ccdc->lsc.state == LSC_STATE_STOPPED) in ccdc_vd1_isr()
1752 ccdc_lsc_enable(ccdc); in ccdc_vd1_isr()
1755 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_vd1_isr()
1763 int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc, u32 events) in omap3isp_ccdc_isr() argument
1765 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) in omap3isp_ccdc_isr()
1769 ccdc_vd1_isr(ccdc); in omap3isp_ccdc_isr()
1771 ccdc_lsc_isr(ccdc, events); in omap3isp_ccdc_isr()
1774 ccdc_vd0_isr(ccdc); in omap3isp_ccdc_isr()
1777 ccdc_hs_vs_isr(ccdc); in omap3isp_ccdc_isr()
1788 struct isp_ccdc_device *ccdc = &video->isp->isp_ccdc; in ccdc_video_queue() local
1792 if (!(ccdc->output & CCDC_OUTPUT_MEMORY)) in ccdc_video_queue()
1795 ccdc_set_outaddr(ccdc, buffer->dma); in ccdc_video_queue()
1803 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_video_queue()
1804 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && !ccdc->running && in ccdc_video_queue()
1805 ccdc->bt656) in ccdc_video_queue()
1808 ccdc->underrun = 1; in ccdc_video_queue()
1809 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_video_queue()
1812 ccdc_enable(ccdc); in ccdc_video_queue()
1835 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_ioctl() local
1840 mutex_lock(&ccdc->ioctl_lock); in ccdc_ioctl()
1841 ret = ccdc_config(ccdc, arg); in ccdc_ioctl()
1842 mutex_unlock(&ccdc->ioctl_lock); in ccdc_ioctl()
1885 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_stream() local
1886 struct isp_device *isp = to_isp_device(ccdc); in ccdc_set_stream()
1889 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) { in ccdc_set_stream()
1897 ccdc_configure(ccdc); in ccdc_set_stream()
1899 ccdc_print_status(ccdc); in ccdc_set_stream()
1904 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_set_stream()
1907 if (ccdc->underrun || !(ccdc->output & CCDC_OUTPUT_MEMORY)) in ccdc_set_stream()
1908 ccdc_enable(ccdc); in ccdc_set_stream()
1910 ccdc->underrun = 0; in ccdc_set_stream()
1914 if (ccdc->output & CCDC_OUTPUT_MEMORY && in ccdc_set_stream()
1915 ccdc->state != ISP_PIPELINE_STREAM_SINGLESHOT) in ccdc_set_stream()
1918 ccdc_enable(ccdc); in ccdc_set_stream()
1922 ret = ccdc_disable(ccdc); in ccdc_set_stream()
1923 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_set_stream()
1926 ccdc->underrun = 0; in ccdc_set_stream()
1930 ccdc->state = enable; in ccdc_set_stream()
1935 __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg, in __ccdc_get_format() argument
1939 return v4l2_subdev_get_try_format(&ccdc->subdev, cfg, pad); in __ccdc_get_format()
1941 return &ccdc->formats[pad]; in __ccdc_get_format()
1945 __ccdc_get_crop(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg, in __ccdc_get_crop() argument
1949 return v4l2_subdev_get_try_crop(&ccdc->subdev, cfg, CCDC_PAD_SOURCE_OF); in __ccdc_get_crop()
1951 return &ccdc->crop; in __ccdc_get_crop()
1962 ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg, in ccdc_try_format() argument
1998 *fmt = *__ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, which); in ccdc_try_format()
2023 crop = __ccdc_get_crop(ccdc, cfg, which); in ccdc_try_format()
2040 *fmt = *__ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, which); in ccdc_try_format()
2072 static void ccdc_try_crop(struct isp_ccdc_device *ccdc, in ccdc_try_crop() argument
2120 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_enum_mbus_code() local
2132 format = __ccdc_get_format(ccdc, cfg, code->pad, in ccdc_enum_mbus_code()
2163 format = __ccdc_get_format(ccdc, cfg, code->pad, in ccdc_enum_mbus_code()
2186 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_enum_frame_size() local
2195 ccdc_try_format(ccdc, cfg, fse->pad, &format, fse->which); in ccdc_enum_frame_size()
2205 ccdc_try_format(ccdc, cfg, fse->pad, &format, fse->which); in ccdc_enum_frame_size()
2226 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_get_selection() local
2239 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, sel->which); in ccdc_get_selection()
2240 ccdc_try_crop(ccdc, format, &sel->r); in ccdc_get_selection()
2244 sel->r = *__ccdc_get_crop(ccdc, cfg, sel->which); in ccdc_get_selection()
2268 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_selection() local
2276 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED) in ccdc_set_selection()
2284 sel->r = *__ccdc_get_crop(ccdc, cfg, sel->which); in ccdc_set_selection()
2288 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, sel->which); in ccdc_set_selection()
2289 ccdc_try_crop(ccdc, format, &sel->r); in ccdc_set_selection()
2290 *__ccdc_get_crop(ccdc, cfg, sel->which) = sel->r; in ccdc_set_selection()
2293 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, sel->which); in ccdc_set_selection()
2294 ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, format, sel->which); in ccdc_set_selection()
2311 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_get_format() local
2314 format = __ccdc_get_format(ccdc, cfg, fmt->pad, fmt->which); in ccdc_get_format()
2334 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_format() local
2338 format = __ccdc_get_format(ccdc, cfg, fmt->pad, fmt->which); in ccdc_set_format()
2342 ccdc_try_format(ccdc, cfg, fmt->pad, &fmt->format, fmt->which); in ccdc_set_format()
2348 crop = __ccdc_get_crop(ccdc, cfg, fmt->which); in ccdc_set_format()
2354 ccdc_try_crop(ccdc, &fmt->format, crop); in ccdc_set_format()
2357 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, in ccdc_set_format()
2360 ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, format, in ccdc_set_format()
2363 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_VP, in ccdc_set_format()
2366 ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_VP, format, in ccdc_set_format()
2407 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_link_validate() local
2416 if (ccdc->input == CCDC_INPUT_PARALLEL) { in ccdc_link_validate()
2511 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_link_setup() local
2512 struct isp_device *isp = to_isp_device(ccdc); in ccdc_link_setup()
2525 ccdc->input = CCDC_INPUT_NONE; in ccdc_link_setup()
2529 if (ccdc->input != CCDC_INPUT_NONE) in ccdc_link_setup()
2533 ccdc->input = CCDC_INPUT_CCP2B; in ccdc_link_setup()
2535 ccdc->input = CCDC_INPUT_CSI2A; in ccdc_link_setup()
2537 ccdc->input = CCDC_INPUT_CSI2C; in ccdc_link_setup()
2539 ccdc->input = CCDC_INPUT_PARALLEL; in ccdc_link_setup()
2553 if (ccdc->output & ~CCDC_OUTPUT_PREVIEW) in ccdc_link_setup()
2555 ccdc->output |= CCDC_OUTPUT_PREVIEW; in ccdc_link_setup()
2557 ccdc->output &= ~CCDC_OUTPUT_PREVIEW; in ccdc_link_setup()
2564 if (ccdc->output & ~CCDC_OUTPUT_MEMORY) in ccdc_link_setup()
2566 ccdc->output |= CCDC_OUTPUT_MEMORY; in ccdc_link_setup()
2568 ccdc->output &= ~CCDC_OUTPUT_MEMORY; in ccdc_link_setup()
2575 if (ccdc->output & ~CCDC_OUTPUT_RESIZER) in ccdc_link_setup()
2577 ccdc->output |= CCDC_OUTPUT_RESIZER; in ccdc_link_setup()
2579 ccdc->output &= ~CCDC_OUTPUT_RESIZER; in ccdc_link_setup()
2596 void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc) in omap3isp_ccdc_unregister_entities() argument
2598 v4l2_device_unregister_subdev(&ccdc->subdev); in omap3isp_ccdc_unregister_entities()
2599 omap3isp_video_unregister(&ccdc->video_out); in omap3isp_ccdc_unregister_entities()
2602 int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, in omap3isp_ccdc_register_entities() argument
2608 ret = v4l2_device_register_subdev(vdev, &ccdc->subdev); in omap3isp_ccdc_register_entities()
2612 ret = omap3isp_video_register(&ccdc->video_out, vdev); in omap3isp_ccdc_register_entities()
2619 omap3isp_ccdc_unregister_entities(ccdc); in omap3isp_ccdc_register_entities()
2633 static int ccdc_init_entities(struct isp_ccdc_device *ccdc) in ccdc_init_entities() argument
2635 struct v4l2_subdev *sd = &ccdc->subdev; in ccdc_init_entities()
2636 struct media_pad *pads = ccdc->pads; in ccdc_init_entities()
2640 ccdc->input = CCDC_INPUT_NONE; in ccdc_init_entities()
2646 v4l2_set_subdevdata(sd, ccdc); in ccdc_init_entities()
2661 ccdc->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in ccdc_init_entities()
2662 ccdc->video_out.ops = &ccdc_video_ops; in ccdc_init_entities()
2663 ccdc->video_out.isp = to_isp_device(ccdc); in ccdc_init_entities()
2664 ccdc->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; in ccdc_init_entities()
2665 ccdc->video_out.bpl_alignment = 32; in ccdc_init_entities()
2667 ret = omap3isp_video_init(&ccdc->video_out, "CCDC"); in ccdc_init_entities()
2688 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_init() local
2691 spin_lock_init(&ccdc->lock); in omap3isp_ccdc_init()
2692 init_waitqueue_head(&ccdc->wait); in omap3isp_ccdc_init()
2693 mutex_init(&ccdc->ioctl_lock); in omap3isp_ccdc_init()
2695 ccdc->stopping = CCDC_STOP_NOT_REQUESTED; in omap3isp_ccdc_init()
2697 INIT_WORK(&ccdc->lsc.table_work, ccdc_lsc_free_table_work); in omap3isp_ccdc_init()
2698 ccdc->lsc.state = LSC_STATE_STOPPED; in omap3isp_ccdc_init()
2699 INIT_LIST_HEAD(&ccdc->lsc.free_queue); in omap3isp_ccdc_init()
2700 spin_lock_init(&ccdc->lsc.req_lock); in omap3isp_ccdc_init()
2702 ccdc->clamp.oblen = 0; in omap3isp_ccdc_init()
2703 ccdc->clamp.dcsubval = 0; in omap3isp_ccdc_init()
2705 ccdc->update = OMAP3ISP_CCDC_BLCLAMP; in omap3isp_ccdc_init()
2706 ccdc_apply_controls(ccdc); in omap3isp_ccdc_init()
2708 ret = ccdc_init_entities(ccdc); in omap3isp_ccdc_init()
2710 mutex_destroy(&ccdc->ioctl_lock); in omap3isp_ccdc_init()
2723 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_cleanup() local
2725 omap3isp_video_cleanup(&ccdc->video_out); in omap3isp_ccdc_cleanup()
2726 media_entity_cleanup(&ccdc->subdev.entity); in omap3isp_ccdc_cleanup()
2731 ccdc_lsc_free_request(ccdc, ccdc->lsc.request); in omap3isp_ccdc_cleanup()
2732 cancel_work_sync(&ccdc->lsc.table_work); in omap3isp_ccdc_cleanup()
2733 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue); in omap3isp_ccdc_cleanup()
2735 if (ccdc->fpc.addr != NULL) in omap3isp_ccdc_cleanup()
2736 dma_free_coherent(isp->dev, ccdc->fpc.fpnum * 4, ccdc->fpc.addr, in omap3isp_ccdc_cleanup()
2737 ccdc->fpc.dma); in omap3isp_ccdc_cleanup()
2739 mutex_destroy(&ccdc->ioctl_lock); in omap3isp_ccdc_cleanup()