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), "%s: Both LSC configuration and table " in ccdc_lsc_config()
464 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_config()
465 if (ccdc->lsc.request) { in ccdc_lsc_config()
466 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue); in ccdc_lsc_config()
467 schedule_work(&ccdc->lsc.table_work); in ccdc_lsc_config()
469 ccdc->lsc.request = req; in ccdc_lsc_config()
470 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_config()
476 ccdc_lsc_free_request(ccdc, req); in ccdc_lsc_config()
481 static inline int ccdc_lsc_is_configured(struct isp_ccdc_device *ccdc) in ccdc_lsc_is_configured() argument
486 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_is_configured()
487 ret = ccdc->lsc.active != NULL; in ccdc_lsc_is_configured()
488 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_is_configured()
493 static int ccdc_lsc_enable(struct isp_ccdc_device *ccdc) in ccdc_lsc_enable() argument
495 struct ispccdc_lsc *lsc = &ccdc->lsc; in ccdc_lsc_enable()
505 if (__ccdc_lsc_configure(ccdc, lsc->request) < 0) { in ccdc_lsc_enable()
506 omap3isp_sbl_disable(to_isp_device(ccdc), in ccdc_lsc_enable()
515 __ccdc_lsc_enable(ccdc, 1); in ccdc_lsc_enable()
535 static void ccdc_configure_clamp(struct isp_ccdc_device *ccdc) in ccdc_configure_clamp() argument
537 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_clamp()
540 if (ccdc->obclamp) { in ccdc_configure_clamp()
541 clamp = ccdc->clamp.obgain << ISPCCDC_CLAMP_OBGAIN_SHIFT; in ccdc_configure_clamp()
542 clamp |= ccdc->clamp.oblen << ISPCCDC_CLAMP_OBSLEN_SHIFT; in ccdc_configure_clamp()
543 clamp |= ccdc->clamp.oblines << ISPCCDC_CLAMP_OBSLN_SHIFT; in ccdc_configure_clamp()
544 clamp |= ccdc->clamp.obstpixel << ISPCCDC_CLAMP_OBST_SHIFT; in ccdc_configure_clamp()
547 isp_reg_writel(isp, ccdc->clamp.dcsubval, in ccdc_configure_clamp()
553 ccdc->obclamp ? ISPCCDC_CLAMP_CLAMPEN : 0); in ccdc_configure_clamp()
560 static void ccdc_configure_fpc(struct isp_ccdc_device *ccdc) in ccdc_configure_fpc() argument
562 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_fpc()
566 if (!ccdc->fpc_en) in ccdc_configure_fpc()
569 isp_reg_writel(isp, ccdc->fpc.dma, OMAP3_ISP_IOMEM_CCDC, in ccdc_configure_fpc()
572 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT), in ccdc_configure_fpc()
574 isp_reg_writel(isp, (ccdc->fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT) | in ccdc_configure_fpc()
582 static void ccdc_configure_black_comp(struct isp_ccdc_device *ccdc) in ccdc_configure_black_comp() argument
584 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_black_comp()
587 blcomp = ccdc->blcomp.b_mg << ISPCCDC_BLKCMP_B_MG_SHIFT; in ccdc_configure_black_comp()
588 blcomp |= ccdc->blcomp.gb_g << ISPCCDC_BLKCMP_GB_G_SHIFT; in ccdc_configure_black_comp()
589 blcomp |= ccdc->blcomp.gr_cy << ISPCCDC_BLKCMP_GR_CY_SHIFT; in ccdc_configure_black_comp()
590 blcomp |= ccdc->blcomp.r_ye << ISPCCDC_BLKCMP_R_YE_SHIFT; in ccdc_configure_black_comp()
599 static void ccdc_configure_lpf(struct isp_ccdc_device *ccdc) in ccdc_configure_lpf() argument
601 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_lpf()
605 ccdc->lpf ? ISPCCDC_SYN_MODE_LPF : 0); in ccdc_configure_lpf()
612 static void ccdc_configure_alaw(struct isp_ccdc_device *ccdc) in ccdc_configure_alaw() argument
614 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure_alaw()
618 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code); in ccdc_configure_alaw()
638 if (ccdc->alaw) in ccdc_configure_alaw()
649 static void ccdc_config_imgattr(struct isp_ccdc_device *ccdc, u32 colptn) in ccdc_config_imgattr() argument
651 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_imgattr()
665 static int ccdc_config(struct isp_ccdc_device *ccdc, in ccdc_config() argument
668 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config()
671 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_config()
672 ccdc->shadow_update = 1; in ccdc_config()
673 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_config()
676 ccdc->alaw = !!(OMAP3ISP_CCDC_ALAW & ccdc_struct->flag); in ccdc_config()
677 ccdc->update |= OMAP3ISP_CCDC_ALAW; in ccdc_config()
681 ccdc->lpf = !!(OMAP3ISP_CCDC_LPF & ccdc_struct->flag); in ccdc_config()
682 ccdc->update |= OMAP3ISP_CCDC_LPF; in ccdc_config()
686 if (copy_from_user(&ccdc->clamp, ccdc_struct->bclamp, in ccdc_config()
687 sizeof(ccdc->clamp))) { in ccdc_config()
688 ccdc->shadow_update = 0; in ccdc_config()
692 ccdc->obclamp = !!(OMAP3ISP_CCDC_BLCLAMP & ccdc_struct->flag); in ccdc_config()
693 ccdc->update |= OMAP3ISP_CCDC_BLCLAMP; in ccdc_config()
697 if (copy_from_user(&ccdc->blcomp, ccdc_struct->blcomp, in ccdc_config()
698 sizeof(ccdc->blcomp))) { in ccdc_config()
699 ccdc->shadow_update = 0; in ccdc_config()
703 ccdc->update |= OMAP3ISP_CCDC_BCOMP; in ccdc_config()
706 ccdc->shadow_update = 0; in ccdc_config()
714 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED) in ccdc_config()
717 ccdc->fpc_en = !!(OMAP3ISP_CCDC_FPC & ccdc_struct->flag); in ccdc_config()
719 if (ccdc->fpc_en) { in ccdc_config()
744 fpc_old = ccdc->fpc; in ccdc_config()
745 ccdc->fpc = fpc_new; in ccdc_config()
748 ccdc_configure_fpc(ccdc); in ccdc_config()
755 return ccdc_lsc_config(ccdc, ccdc_struct); in ccdc_config()
758 static void ccdc_apply_controls(struct isp_ccdc_device *ccdc) in ccdc_apply_controls() argument
760 if (ccdc->update & OMAP3ISP_CCDC_ALAW) { in ccdc_apply_controls()
761 ccdc_configure_alaw(ccdc); in ccdc_apply_controls()
762 ccdc->update &= ~OMAP3ISP_CCDC_ALAW; in ccdc_apply_controls()
765 if (ccdc->update & OMAP3ISP_CCDC_LPF) { in ccdc_apply_controls()
766 ccdc_configure_lpf(ccdc); in ccdc_apply_controls()
767 ccdc->update &= ~OMAP3ISP_CCDC_LPF; in ccdc_apply_controls()
770 if (ccdc->update & OMAP3ISP_CCDC_BLCLAMP) { in ccdc_apply_controls()
771 ccdc_configure_clamp(ccdc); in ccdc_apply_controls()
772 ccdc->update &= ~OMAP3ISP_CCDC_BLCLAMP; in ccdc_apply_controls()
775 if (ccdc->update & OMAP3ISP_CCDC_BCOMP) { in ccdc_apply_controls()
776 ccdc_configure_black_comp(ccdc); in ccdc_apply_controls()
777 ccdc->update &= ~OMAP3ISP_CCDC_BCOMP; in ccdc_apply_controls()
787 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_restore_context() local
791 ccdc->update = OMAP3ISP_CCDC_ALAW | OMAP3ISP_CCDC_LPF in omap3isp_ccdc_restore_context()
793 ccdc_apply_controls(ccdc); in omap3isp_ccdc_restore_context()
794 ccdc_configure_fpc(ccdc); in omap3isp_ccdc_restore_context()
805 static void ccdc_config_vp(struct isp_ccdc_device *ccdc) in ccdc_config_vp() argument
807 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_config_vp()
808 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_vp()
816 format = &ccdc->formats[CCDC_PAD_SOURCE_VP]; in ccdc_config_vp()
837 info = omap3isp_video_format_info(ccdc->formats[CCDC_PAD_SINK].code); in ccdc_config_vp()
886 static void ccdc_config_outlineoffset(struct isp_ccdc_device *ccdc, in ccdc_config_outlineoffset() argument
890 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_outlineoffset()
923 static void ccdc_set_outaddr(struct isp_ccdc_device *ccdc, u32 addr) in ccdc_set_outaddr() argument
925 struct isp_device *isp = to_isp_device(ccdc); in ccdc_set_outaddr()
937 void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc, in omap3isp_ccdc_max_rate() argument
940 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in omap3isp_ccdc_max_rate()
950 if (ccdc->input == CCDC_INPUT_PARALLEL) in omap3isp_ccdc_max_rate()
964 static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc, in ccdc_config_sync_if() argument
968 struct isp_device *isp = to_isp_device(ccdc); in ccdc_config_sync_if()
972 format = &ccdc->formats[CCDC_PAD_SINK]; in ccdc_config_sync_if()
982 if (ccdc->bt656) in ccdc_config_sync_if()
1012 if ((parcfg && parcfg->vs_pol) || ccdc->bt656) in ccdc_config_sync_if()
1033 if (ccdc->bt656) in ccdc_config_sync_if()
1115 static void ccdc_configure(struct isp_ccdc_device *ccdc) in ccdc_configure() argument
1117 struct isp_device *isp = to_isp_device(ccdc); in ccdc_configure()
1135 ccdc->bt656 = false; in ccdc_configure()
1136 ccdc->fields = 0; in ccdc_configure()
1138 pad = media_entity_remote_pad(&ccdc->pads[CCDC_PAD_SINK]); in ccdc_configure()
1140 if (ccdc->input == CCDC_INPUT_PARALLEL) { in ccdc_configure()
1146 ccdc->bt656 = cfg.type == V4L2_MBUS_BT656; in ccdc_configure()
1153 format = &ccdc->formats[CCDC_PAD_SINK]; in ccdc_configure()
1169 if (ccdc->bt656) in ccdc_configure()
1178 omap3isp_configure_bridge(isp, ccdc->input, parcfg, shift, bridge); in ccdc_configure()
1181 ccdc_config_sync_if(ccdc, parcfg, depth_out); in ccdc_configure()
1190 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_configure()
1195 if (ccdc->output & CCDC_OUTPUT_RESIZER) in ccdc_configure()
1219 ccdc_config_imgattr(ccdc, ccdc_pattern); in ccdc_configure()
1229 format = &ccdc->formats[CCDC_PAD_SOURCE_OF]; in ccdc_configure()
1230 crop = &ccdc->crop; in ccdc_configure()
1237 if (ccdc->bt656) { in ccdc_configure()
1255 ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value, in ccdc_configure()
1262 if (ccdc->formats[CCDC_PAD_SINK].field == V4L2_FIELD_ALTERNATE && in ccdc_configure()
1281 if (omap3isp_video_format_info(format->code)->width <= 8 || ccdc->bt656) in ccdc_configure()
1289 ccdc_config_vp(ccdc); in ccdc_configure()
1292 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_configure()
1293 if (ccdc->lsc.request == NULL) in ccdc_configure()
1296 WARN_ON(ccdc->lsc.active); in ccdc_configure()
1301 if (ccdc->lsc.active == NULL && in ccdc_configure()
1302 __ccdc_lsc_configure(ccdc, ccdc->lsc.request) == 0) { in ccdc_configure()
1303 ccdc->lsc.active = ccdc->lsc.request; in ccdc_configure()
1305 list_add_tail(&ccdc->lsc.request->list, &ccdc->lsc.free_queue); in ccdc_configure()
1306 schedule_work(&ccdc->lsc.table_work); in ccdc_configure()
1309 ccdc->lsc.request = NULL; in ccdc_configure()
1312 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_configure()
1314 ccdc_apply_controls(ccdc); in ccdc_configure()
1317 static void __ccdc_enable(struct isp_ccdc_device *ccdc, int enable) in __ccdc_enable() argument
1319 struct isp_device *isp = to_isp_device(ccdc); in __ccdc_enable()
1324 ccdc->running = enable; in __ccdc_enable()
1327 static int ccdc_disable(struct isp_ccdc_device *ccdc) in ccdc_disable() argument
1332 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_disable()
1333 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS) in ccdc_disable()
1334 ccdc->stopping = CCDC_STOP_REQUEST; in ccdc_disable()
1335 if (!ccdc->running) in ccdc_disable()
1336 ccdc->stopping = CCDC_STOP_FINISHED; in ccdc_disable()
1337 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_disable()
1339 ret = wait_event_timeout(ccdc->wait, in ccdc_disable()
1340 ccdc->stopping == CCDC_STOP_FINISHED, in ccdc_disable()
1344 dev_warn(to_device(ccdc), "CCDC stop timeout!\n"); in ccdc_disable()
1347 omap3isp_sbl_disable(to_isp_device(ccdc), OMAP3_ISP_SBL_CCDC_LSC_READ); in ccdc_disable()
1349 mutex_lock(&ccdc->ioctl_lock); in ccdc_disable()
1350 ccdc_lsc_free_request(ccdc, ccdc->lsc.request); in ccdc_disable()
1351 ccdc->lsc.request = ccdc->lsc.active; in ccdc_disable()
1352 ccdc->lsc.active = NULL; in ccdc_disable()
1353 cancel_work_sync(&ccdc->lsc.table_work); in ccdc_disable()
1354 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue); in ccdc_disable()
1355 mutex_unlock(&ccdc->ioctl_lock); in ccdc_disable()
1357 ccdc->stopping = CCDC_STOP_NOT_REQUESTED; in ccdc_disable()
1362 static void ccdc_enable(struct isp_ccdc_device *ccdc) in ccdc_enable() argument
1364 if (ccdc_lsc_is_configured(ccdc)) in ccdc_enable()
1365 __ccdc_lsc_enable(ccdc, 1); in ccdc_enable()
1366 __ccdc_enable(ccdc, 1); in ccdc_enable()
1380 static int ccdc_sbl_busy(struct isp_ccdc_device *ccdc) in ccdc_sbl_busy() argument
1382 struct isp_device *isp = to_isp_device(ccdc); in ccdc_sbl_busy()
1384 return omap3isp_ccdc_busy(ccdc) in ccdc_sbl_busy()
1400 static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc, in ccdc_sbl_wait_idle() argument
1409 if (!ccdc_sbl_busy(ccdc)) in ccdc_sbl_wait_idle()
1426 static int ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) in ccdc_handle_stopping() argument
1430 switch ((ccdc->stopping & 3) | event) { in ccdc_handle_stopping()
1432 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_handle_stopping()
1433 __ccdc_lsc_enable(ccdc, 0); in ccdc_handle_stopping()
1434 __ccdc_enable(ccdc, 0); in ccdc_handle_stopping()
1435 ccdc->stopping = CCDC_STOP_EXECUTED; in ccdc_handle_stopping()
1439 ccdc->stopping |= CCDC_STOP_CCDC_FINISHED; in ccdc_handle_stopping()
1440 if (ccdc->lsc.state == LSC_STATE_STOPPED) in ccdc_handle_stopping()
1441 ccdc->stopping |= CCDC_STOP_LSC_FINISHED; in ccdc_handle_stopping()
1446 ccdc->stopping |= CCDC_STOP_LSC_FINISHED; in ccdc_handle_stopping()
1454 if (ccdc->stopping == CCDC_STOP_FINISHED) { in ccdc_handle_stopping()
1455 wake_up(&ccdc->wait); in ccdc_handle_stopping()
1462 static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) in ccdc_hs_vs_isr() argument
1464 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_hs_vs_isr()
1465 struct video_device *vdev = ccdc->subdev.devnode; in ccdc_hs_vs_isr()
1483 static void ccdc_lsc_isr(struct isp_ccdc_device *ccdc, u32 events) in ccdc_lsc_isr() argument
1489 to_isp_pipeline(&ccdc->subdev.entity); in ccdc_lsc_isr()
1491 ccdc_lsc_error_handler(ccdc); in ccdc_lsc_isr()
1493 dev_dbg(to_device(ccdc), "lsc prefetch error\n"); in ccdc_lsc_isr()
1503 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_lsc_isr()
1505 if (ccdc->lsc.state == LSC_STATE_STOPPING) in ccdc_lsc_isr()
1506 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_isr()
1508 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_LSC_DONE)) in ccdc_lsc_isr()
1511 if (ccdc->lsc.state != LSC_STATE_RECONFIG) in ccdc_lsc_isr()
1515 ccdc->lsc.state = LSC_STATE_STOPPED; in ccdc_lsc_isr()
1527 if (ccdc->lsc.request == NULL) in ccdc_lsc_isr()
1530 ccdc_lsc_enable(ccdc); in ccdc_lsc_isr()
1533 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_lsc_isr()
1540 static bool ccdc_has_all_fields(struct isp_ccdc_device *ccdc) in ccdc_has_all_fields() argument
1542 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_has_all_fields()
1543 struct isp_device *isp = to_isp_device(ccdc); in ccdc_has_all_fields()
1544 enum v4l2_field of_field = ccdc->formats[CCDC_PAD_SOURCE_OF].field; in ccdc_has_all_fields()
1565 ccdc->fields |= field == V4L2_FIELD_BOTTOM in ccdc_has_all_fields()
1568 if (ccdc->fields != CCDC_FIELD_BOTH) in ccdc_has_all_fields()
1579 ccdc->fields = 0; in ccdc_has_all_fields()
1584 static int ccdc_isr_buffer(struct isp_ccdc_device *ccdc) in ccdc_isr_buffer() argument
1586 struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); in ccdc_isr_buffer()
1587 struct isp_device *isp = to_isp_device(ccdc); in ccdc_isr_buffer()
1596 if (list_empty(&ccdc->video_out.dmaqueue)) in ccdc_isr_buffer()
1603 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && ccdc->underrun) { in ccdc_isr_buffer()
1604 ccdc->underrun = 0; in ccdc_isr_buffer()
1609 if (ccdc_sbl_wait_idle(ccdc, 1000)) { in ccdc_isr_buffer()
1611 isp->crashed |= 1U << ccdc->subdev.entity.id; in ccdc_isr_buffer()
1616 if (!ccdc_has_all_fields(ccdc)) in ccdc_isr_buffer()
1619 buffer = omap3isp_video_buffer_next(&ccdc->video_out); in ccdc_isr_buffer()
1621 ccdc_set_outaddr(ccdc, buffer->dma); in ccdc_isr_buffer()
1625 if (ccdc->state == ISP_PIPELINE_STREAM_SINGLESHOT && in ccdc_isr_buffer()
1639 static void ccdc_vd0_isr(struct isp_ccdc_device *ccdc) in ccdc_vd0_isr() argument
1647 if (ccdc->bt656) { in ccdc_vd0_isr()
1649 to_isp_pipeline(&ccdc->subdev.entity); in ccdc_vd0_isr()
1658 if (ccdc->bt656) { in ccdc_vd0_isr()
1659 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_vd0_isr()
1660 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && in ccdc_vd0_isr()
1661 ccdc->output & CCDC_OUTPUT_MEMORY) { in ccdc_vd0_isr()
1662 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_vd0_isr()
1663 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd0_isr()
1664 __ccdc_enable(ccdc, 0); in ccdc_vd0_isr()
1666 ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1); in ccdc_vd0_isr()
1667 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1670 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_vd0_isr()
1671 restart = ccdc_isr_buffer(ccdc); in ccdc_vd0_isr()
1673 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_vd0_isr()
1675 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) { in ccdc_vd0_isr()
1676 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1680 if (!ccdc->shadow_update) in ccdc_vd0_isr()
1681 ccdc_apply_controls(ccdc); in ccdc_vd0_isr()
1682 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_vd0_isr()
1685 ccdc_enable(ccdc); in ccdc_vd0_isr()
1692 static void ccdc_vd1_isr(struct isp_ccdc_device *ccdc) in ccdc_vd1_isr() argument
1705 if (ccdc->bt656) in ccdc_vd1_isr()
1708 spin_lock_irqsave(&ccdc->lsc.req_lock, flags); in ccdc_vd1_isr()
1720 switch (ccdc->state) { in ccdc_vd1_isr()
1722 ccdc->stopping = CCDC_STOP_REQUEST; in ccdc_vd1_isr()
1726 if (ccdc->output & CCDC_OUTPUT_MEMORY) { in ccdc_vd1_isr()
1727 if (ccdc->lsc.state != LSC_STATE_STOPPED) in ccdc_vd1_isr()
1728 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd1_isr()
1729 __ccdc_enable(ccdc, 0); in ccdc_vd1_isr()
1737 if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD1)) in ccdc_vd1_isr()
1740 if (ccdc->lsc.request == NULL) in ccdc_vd1_isr()
1747 if (ccdc->lsc.state == LSC_STATE_RUNNING) { in ccdc_vd1_isr()
1748 __ccdc_lsc_enable(ccdc, 0); in ccdc_vd1_isr()
1749 ccdc->lsc.state = LSC_STATE_RECONFIG; in ccdc_vd1_isr()
1754 if (ccdc->lsc.state == LSC_STATE_STOPPED) in ccdc_vd1_isr()
1755 ccdc_lsc_enable(ccdc); in ccdc_vd1_isr()
1758 spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags); in ccdc_vd1_isr()
1766 int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc, u32 events) in omap3isp_ccdc_isr() argument
1768 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) in omap3isp_ccdc_isr()
1772 ccdc_vd1_isr(ccdc); in omap3isp_ccdc_isr()
1774 ccdc_lsc_isr(ccdc, events); in omap3isp_ccdc_isr()
1777 ccdc_vd0_isr(ccdc); in omap3isp_ccdc_isr()
1780 ccdc_hs_vs_isr(ccdc); in omap3isp_ccdc_isr()
1791 struct isp_ccdc_device *ccdc = &video->isp->isp_ccdc; in ccdc_video_queue() local
1795 if (!(ccdc->output & CCDC_OUTPUT_MEMORY)) in ccdc_video_queue()
1798 ccdc_set_outaddr(ccdc, buffer->dma); in ccdc_video_queue()
1806 spin_lock_irqsave(&ccdc->lock, flags); in ccdc_video_queue()
1807 if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS && !ccdc->running && in ccdc_video_queue()
1808 ccdc->bt656) in ccdc_video_queue()
1811 ccdc->underrun = 1; in ccdc_video_queue()
1812 spin_unlock_irqrestore(&ccdc->lock, flags); in ccdc_video_queue()
1815 ccdc_enable(ccdc); in ccdc_video_queue()
1838 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_ioctl() local
1843 mutex_lock(&ccdc->ioctl_lock); in ccdc_ioctl()
1844 ret = ccdc_config(ccdc, arg); in ccdc_ioctl()
1845 mutex_unlock(&ccdc->ioctl_lock); in ccdc_ioctl()
1888 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_stream() local
1889 struct isp_device *isp = to_isp_device(ccdc); in ccdc_set_stream()
1892 if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED) { in ccdc_set_stream()
1900 ccdc_configure(ccdc); in ccdc_set_stream()
1902 ccdc_print_status(ccdc); in ccdc_set_stream()
1907 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_set_stream()
1910 if (ccdc->underrun || !(ccdc->output & CCDC_OUTPUT_MEMORY)) in ccdc_set_stream()
1911 ccdc_enable(ccdc); in ccdc_set_stream()
1913 ccdc->underrun = 0; in ccdc_set_stream()
1917 if (ccdc->output & CCDC_OUTPUT_MEMORY && in ccdc_set_stream()
1918 ccdc->state != ISP_PIPELINE_STREAM_SINGLESHOT) in ccdc_set_stream()
1921 ccdc_enable(ccdc); in ccdc_set_stream()
1925 ret = ccdc_disable(ccdc); in ccdc_set_stream()
1926 if (ccdc->output & CCDC_OUTPUT_MEMORY) in ccdc_set_stream()
1929 ccdc->underrun = 0; in ccdc_set_stream()
1933 ccdc->state = enable; in ccdc_set_stream()
1938 __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg, in __ccdc_get_format() argument
1942 return v4l2_subdev_get_try_format(&ccdc->subdev, cfg, pad); in __ccdc_get_format()
1944 return &ccdc->formats[pad]; in __ccdc_get_format()
1948 __ccdc_get_crop(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg, in __ccdc_get_crop() argument
1952 return v4l2_subdev_get_try_crop(&ccdc->subdev, cfg, CCDC_PAD_SOURCE_OF); in __ccdc_get_crop()
1954 return &ccdc->crop; in __ccdc_get_crop()
1965 ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg, in ccdc_try_format() argument
2001 *fmt = *__ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, which); in ccdc_try_format()
2026 crop = __ccdc_get_crop(ccdc, cfg, which); in ccdc_try_format()
2043 *fmt = *__ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, which); in ccdc_try_format()
2075 static void ccdc_try_crop(struct isp_ccdc_device *ccdc, in ccdc_try_crop() argument
2123 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_enum_mbus_code() local
2135 format = __ccdc_get_format(ccdc, cfg, code->pad, in ccdc_enum_mbus_code()
2166 format = __ccdc_get_format(ccdc, cfg, code->pad, in ccdc_enum_mbus_code()
2189 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_enum_frame_size() local
2198 ccdc_try_format(ccdc, cfg, fse->pad, &format, fse->which); in ccdc_enum_frame_size()
2208 ccdc_try_format(ccdc, cfg, fse->pad, &format, fse->which); in ccdc_enum_frame_size()
2229 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_get_selection() local
2242 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, sel->which); in ccdc_get_selection()
2243 ccdc_try_crop(ccdc, format, &sel->r); in ccdc_get_selection()
2247 sel->r = *__ccdc_get_crop(ccdc, cfg, sel->which); in ccdc_get_selection()
2271 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_selection() local
2279 if (ccdc->state != ISP_PIPELINE_STREAM_STOPPED) in ccdc_set_selection()
2287 sel->r = *__ccdc_get_crop(ccdc, cfg, sel->which); in ccdc_set_selection()
2291 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, sel->which); in ccdc_set_selection()
2292 ccdc_try_crop(ccdc, format, &sel->r); in ccdc_set_selection()
2293 *__ccdc_get_crop(ccdc, cfg, sel->which) = sel->r; in ccdc_set_selection()
2296 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, sel->which); in ccdc_set_selection()
2297 ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, format, sel->which); in ccdc_set_selection()
2314 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_get_format() local
2317 format = __ccdc_get_format(ccdc, cfg, fmt->pad, fmt->which); in ccdc_get_format()
2337 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_set_format() local
2341 format = __ccdc_get_format(ccdc, cfg, fmt->pad, fmt->which); in ccdc_set_format()
2345 ccdc_try_format(ccdc, cfg, fmt->pad, &fmt->format, fmt->which); in ccdc_set_format()
2351 crop = __ccdc_get_crop(ccdc, cfg, fmt->which); in ccdc_set_format()
2357 ccdc_try_crop(ccdc, &fmt->format, crop); in ccdc_set_format()
2360 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, in ccdc_set_format()
2363 ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, format, in ccdc_set_format()
2366 format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_VP, in ccdc_set_format()
2369 ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_VP, format, in ccdc_set_format()
2410 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_link_validate() local
2419 if (ccdc->input == CCDC_INPUT_PARALLEL) { in ccdc_link_validate()
2514 struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd); in ccdc_link_setup() local
2515 struct isp_device *isp = to_isp_device(ccdc); in ccdc_link_setup()
2523 ccdc->input = CCDC_INPUT_NONE; in ccdc_link_setup()
2527 if (ccdc->input != CCDC_INPUT_NONE) in ccdc_link_setup()
2531 ccdc->input = CCDC_INPUT_CCP2B; in ccdc_link_setup()
2533 ccdc->input = CCDC_INPUT_CSI2A; in ccdc_link_setup()
2535 ccdc->input = CCDC_INPUT_CSI2C; in ccdc_link_setup()
2537 ccdc->input = CCDC_INPUT_PARALLEL; in ccdc_link_setup()
2551 if (ccdc->output & ~CCDC_OUTPUT_PREVIEW) in ccdc_link_setup()
2553 ccdc->output |= CCDC_OUTPUT_PREVIEW; in ccdc_link_setup()
2555 ccdc->output &= ~CCDC_OUTPUT_PREVIEW; in ccdc_link_setup()
2562 if (ccdc->output & ~CCDC_OUTPUT_MEMORY) in ccdc_link_setup()
2564 ccdc->output |= CCDC_OUTPUT_MEMORY; in ccdc_link_setup()
2566 ccdc->output &= ~CCDC_OUTPUT_MEMORY; in ccdc_link_setup()
2573 if (ccdc->output & ~CCDC_OUTPUT_RESIZER) in ccdc_link_setup()
2575 ccdc->output |= CCDC_OUTPUT_RESIZER; in ccdc_link_setup()
2577 ccdc->output &= ~CCDC_OUTPUT_RESIZER; in ccdc_link_setup()
2594 void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc) in omap3isp_ccdc_unregister_entities() argument
2596 v4l2_device_unregister_subdev(&ccdc->subdev); in omap3isp_ccdc_unregister_entities()
2597 omap3isp_video_unregister(&ccdc->video_out); in omap3isp_ccdc_unregister_entities()
2600 int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, in omap3isp_ccdc_register_entities() argument
2606 ret = v4l2_device_register_subdev(vdev, &ccdc->subdev); in omap3isp_ccdc_register_entities()
2610 ret = omap3isp_video_register(&ccdc->video_out, vdev); in omap3isp_ccdc_register_entities()
2617 omap3isp_ccdc_unregister_entities(ccdc); in omap3isp_ccdc_register_entities()
2631 static int ccdc_init_entities(struct isp_ccdc_device *ccdc) in ccdc_init_entities() argument
2633 struct v4l2_subdev *sd = &ccdc->subdev; in ccdc_init_entities()
2634 struct media_pad *pads = ccdc->pads; in ccdc_init_entities()
2638 ccdc->input = CCDC_INPUT_NONE; in ccdc_init_entities()
2644 v4l2_set_subdevdata(sd, ccdc); in ccdc_init_entities()
2659 ccdc->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in ccdc_init_entities()
2660 ccdc->video_out.ops = &ccdc_video_ops; in ccdc_init_entities()
2661 ccdc->video_out.isp = to_isp_device(ccdc); in ccdc_init_entities()
2662 ccdc->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3; in ccdc_init_entities()
2663 ccdc->video_out.bpl_alignment = 32; in ccdc_init_entities()
2665 ret = omap3isp_video_init(&ccdc->video_out, "CCDC"); in ccdc_init_entities()
2670 ret = media_entity_create_link(&ccdc->subdev.entity, CCDC_PAD_SOURCE_OF, in ccdc_init_entities()
2671 &ccdc->video_out.video.entity, 0, 0); in ccdc_init_entities()
2678 omap3isp_video_cleanup(&ccdc->video_out); in ccdc_init_entities()
2694 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_init() local
2697 spin_lock_init(&ccdc->lock); in omap3isp_ccdc_init()
2698 init_waitqueue_head(&ccdc->wait); in omap3isp_ccdc_init()
2699 mutex_init(&ccdc->ioctl_lock); in omap3isp_ccdc_init()
2701 ccdc->stopping = CCDC_STOP_NOT_REQUESTED; in omap3isp_ccdc_init()
2703 INIT_WORK(&ccdc->lsc.table_work, ccdc_lsc_free_table_work); in omap3isp_ccdc_init()
2704 ccdc->lsc.state = LSC_STATE_STOPPED; in omap3isp_ccdc_init()
2705 INIT_LIST_HEAD(&ccdc->lsc.free_queue); in omap3isp_ccdc_init()
2706 spin_lock_init(&ccdc->lsc.req_lock); in omap3isp_ccdc_init()
2708 ccdc->clamp.oblen = 0; in omap3isp_ccdc_init()
2709 ccdc->clamp.dcsubval = 0; in omap3isp_ccdc_init()
2711 ccdc->update = OMAP3ISP_CCDC_BLCLAMP; in omap3isp_ccdc_init()
2712 ccdc_apply_controls(ccdc); in omap3isp_ccdc_init()
2714 ret = ccdc_init_entities(ccdc); in omap3isp_ccdc_init()
2716 mutex_destroy(&ccdc->ioctl_lock); in omap3isp_ccdc_init()
2729 struct isp_ccdc_device *ccdc = &isp->isp_ccdc; in omap3isp_ccdc_cleanup() local
2731 omap3isp_video_cleanup(&ccdc->video_out); in omap3isp_ccdc_cleanup()
2732 media_entity_cleanup(&ccdc->subdev.entity); in omap3isp_ccdc_cleanup()
2737 ccdc_lsc_free_request(ccdc, ccdc->lsc.request); in omap3isp_ccdc_cleanup()
2738 cancel_work_sync(&ccdc->lsc.table_work); in omap3isp_ccdc_cleanup()
2739 ccdc_lsc_free_queue(ccdc, &ccdc->lsc.free_queue); in omap3isp_ccdc_cleanup()
2741 if (ccdc->fpc.addr != NULL) in omap3isp_ccdc_cleanup()
2742 dma_free_coherent(isp->dev, ccdc->fpc.fpnum * 4, ccdc->fpc.addr, in omap3isp_ccdc_cleanup()
2743 ccdc->fpc.dma); in omap3isp_ccdc_cleanup()
2745 mutex_destroy(&ccdc->ioctl_lock); in omap3isp_ccdc_cleanup()