Lines Matching refs:isp
84 static void isp_save_ctx(struct isp_device *isp);
86 static void isp_restore_ctx(struct isp_device *isp);
149 void omap3isp_flush(struct isp_device *isp) in omap3isp_flush() argument
151 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in omap3isp_flush()
152 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in omap3isp_flush()
165 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, in isp_xclk_update()
170 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, in isp_xclk_update()
181 omap3isp_get(xclk->isp); in isp_xclk_prepare()
190 omap3isp_put(xclk->isp); in isp_xclk_unprepare()
269 dev_dbg(xclk->isp->dev, "%s: cam_xclk%c set to %lu Hz (div %u)\n", in isp_xclk_set_rate()
289 struct isp_device *isp = data; in isp_xclk_src_get() local
291 if (idx >= ARRAY_SIZE(isp->xclks)) in isp_xclk_src_get()
294 return isp->xclks[idx].clk; in isp_xclk_src_get()
297 static int isp_xclk_init(struct isp_device *isp) in isp_xclk_init() argument
299 struct device_node *np = isp->dev->of_node; in isp_xclk_init()
303 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) in isp_xclk_init()
304 isp->xclks[i].clk = ERR_PTR(-EINVAL); in isp_xclk_init()
306 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) { in isp_xclk_init()
307 struct isp_xclk *xclk = &isp->xclks[i]; in isp_xclk_init()
309 xclk->isp = isp; in isp_xclk_init()
332 of_clk_add_provider(np, isp_xclk_src_get, isp); in isp_xclk_init()
337 static void isp_xclk_cleanup(struct isp_device *isp) in isp_xclk_cleanup() argument
339 struct device_node *np = isp->dev->of_node; in isp_xclk_cleanup()
345 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) { in isp_xclk_cleanup()
346 struct isp_xclk *xclk = &isp->xclks[i]; in isp_xclk_cleanup()
361 static void isp_enable_interrupts(struct isp_device *isp) in isp_enable_interrupts() argument
376 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_enable_interrupts()
377 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE); in isp_enable_interrupts()
384 static void isp_disable_interrupts(struct isp_device *isp) in isp_disable_interrupts() argument
386 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE); in isp_disable_interrupts()
401 static void isp_core_init(struct isp_device *isp, int idle) in isp_core_init() argument
403 isp_reg_writel(isp, in isp_core_init()
407 ((isp->revision == ISP_REVISION_15_0) ? in isp_core_init()
411 isp_reg_writel(isp, in isp_core_init()
412 (isp->autoidle ? ISPCTRL_SBL_AUTOIDLE : 0) | in isp_core_init()
428 void omap3isp_configure_bridge(struct isp_device *isp, in omap3isp_configure_bridge() argument
435 ispctrl_val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); in omap3isp_configure_bridge()
467 isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); in omap3isp_configure_bridge()
470 void omap3isp_hist_dma_done(struct isp_device *isp) in omap3isp_hist_dma_done() argument
472 if (omap3isp_ccdc_busy(&isp->isp_ccdc) || in omap3isp_hist_dma_done()
473 omap3isp_stat_pcr_busy(&isp->isp_hist)) { in omap3isp_hist_dma_done()
475 atomic_set(&isp->isp_hist.buf_err, 1); in omap3isp_hist_dma_done()
476 dev_dbg(isp->dev, in omap3isp_hist_dma_done()
481 static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus) in isp_isr_dbg() argument
519 dev_dbg(isp->dev, "ISP IRQ: "); in isp_isr_dbg()
528 static void isp_isr_sbl(struct isp_device *isp) in isp_isr_sbl() argument
530 struct device *dev = isp->dev; in isp_isr_sbl()
538 sbl_pcr = isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR); in isp_isr_sbl()
539 isp_reg_writel(isp, sbl_pcr, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR); in isp_isr_sbl()
546 pipe = to_isp_pipeline(&isp->isp_ccp2.subdev.entity); in isp_isr_sbl()
552 pipe = to_isp_pipeline(&isp->isp_csi2a.subdev.entity); in isp_isr_sbl()
558 pipe = to_isp_pipeline(&isp->isp_ccdc.subdev.entity); in isp_isr_sbl()
564 pipe = to_isp_pipeline(&isp->isp_prev.subdev.entity); in isp_isr_sbl()
573 pipe = to_isp_pipeline(&isp->isp_res.subdev.entity); in isp_isr_sbl()
579 omap3isp_stat_sbl_overflow(&isp->isp_af); in isp_isr_sbl()
582 omap3isp_stat_sbl_overflow(&isp->isp_aewb); in isp_isr_sbl()
599 struct isp_device *isp = _isp; in isp_isr() local
602 irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_isr()
603 isp_reg_writel(isp, irqstatus, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_isr()
605 isp_isr_sbl(isp); in isp_isr()
608 omap3isp_csi2_isr(&isp->isp_csi2a); in isp_isr()
611 omap3isp_ccp2_isr(&isp->isp_ccp2); in isp_isr()
614 if (isp->isp_ccdc.output & CCDC_OUTPUT_PREVIEW) in isp_isr()
615 omap3isp_preview_isr_frame_sync(&isp->isp_prev); in isp_isr()
616 if (isp->isp_ccdc.output & CCDC_OUTPUT_RESIZER) in isp_isr()
617 omap3isp_resizer_isr_frame_sync(&isp->isp_res); in isp_isr()
618 omap3isp_stat_isr_frame_sync(&isp->isp_aewb); in isp_isr()
619 omap3isp_stat_isr_frame_sync(&isp->isp_af); in isp_isr()
620 omap3isp_stat_isr_frame_sync(&isp->isp_hist); in isp_isr()
624 omap3isp_ccdc_isr(&isp->isp_ccdc, irqstatus & ccdc_events); in isp_isr()
627 if (isp->isp_prev.output & PREVIEW_OUTPUT_RESIZER) in isp_isr()
628 omap3isp_resizer_isr_frame_sync(&isp->isp_res); in isp_isr()
629 omap3isp_preview_isr(&isp->isp_prev); in isp_isr()
633 omap3isp_resizer_isr(&isp->isp_res); in isp_isr()
636 omap3isp_stat_isr(&isp->isp_aewb); in isp_isr()
639 omap3isp_stat_isr(&isp->isp_af); in isp_isr()
642 omap3isp_stat_isr(&isp->isp_hist); in isp_isr()
644 omap3isp_flush(isp); in isp_isr()
647 isp_isr_dbg(isp, irqstatus); in isp_isr()
675 struct isp_device *isp = pipe->output->isp; in isp_pipeline_enable() local
687 if (media_entity_enum_intersects(&pipe->ent_enum, &isp->crashed)) in isp_pipeline_enable()
713 if (subdev == &isp->isp_ccdc.subdev) { in isp_pipeline_enable()
714 v4l2_subdev_call(&isp->isp_aewb.subdev, video, in isp_pipeline_enable()
716 v4l2_subdev_call(&isp->isp_af.subdev, video, in isp_pipeline_enable()
718 v4l2_subdev_call(&isp->isp_hist.subdev, video, in isp_pipeline_enable()
724 if (subdev->dev != isp->dev) in isp_pipeline_enable()
731 static int isp_pipeline_wait_resizer(struct isp_device *isp) in isp_pipeline_wait_resizer() argument
733 return omap3isp_resizer_busy(&isp->isp_res); in isp_pipeline_wait_resizer()
736 static int isp_pipeline_wait_preview(struct isp_device *isp) in isp_pipeline_wait_preview() argument
738 return omap3isp_preview_busy(&isp->isp_prev); in isp_pipeline_wait_preview()
741 static int isp_pipeline_wait_ccdc(struct isp_device *isp) in isp_pipeline_wait_ccdc() argument
743 return omap3isp_stat_busy(&isp->isp_af) in isp_pipeline_wait_ccdc()
744 || omap3isp_stat_busy(&isp->isp_aewb) in isp_pipeline_wait_ccdc()
745 || omap3isp_stat_busy(&isp->isp_hist) in isp_pipeline_wait_ccdc()
746 || omap3isp_ccdc_busy(&isp->isp_ccdc); in isp_pipeline_wait_ccdc()
751 static int isp_pipeline_wait(struct isp_device *isp, in isp_pipeline_wait() argument
752 int(*busy)(struct isp_device *isp)) in isp_pipeline_wait() argument
757 if (!busy(isp)) in isp_pipeline_wait()
778 struct isp_device *isp = pipe->output->isp; in isp_pipeline_disable() local
802 if (subdev == &isp->isp_ccdc.subdev) { in isp_pipeline_disable()
803 v4l2_subdev_call(&isp->isp_aewb.subdev, in isp_pipeline_disable()
805 v4l2_subdev_call(&isp->isp_af.subdev, in isp_pipeline_disable()
807 v4l2_subdev_call(&isp->isp_hist.subdev, in isp_pipeline_disable()
813 if (subdev == &isp->isp_res.subdev) in isp_pipeline_disable()
814 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_resizer); in isp_pipeline_disable()
815 else if (subdev == &isp->isp_prev.subdev) in isp_pipeline_disable()
816 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_preview); in isp_pipeline_disable()
817 else if (subdev == &isp->isp_ccdc.subdev) in isp_pipeline_disable()
818 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_ccdc); in isp_pipeline_disable()
833 dev_info(isp->dev, "Unable to stop %s\n", subdev->name); in isp_pipeline_disable()
834 isp->stop_failure = true; in isp_pipeline_disable()
835 if (subdev == &isp->isp_prev.subdev) in isp_pipeline_disable()
836 media_entity_enum_set(&isp->crashed, in isp_pipeline_disable()
842 if (subdev->dev != isp->dev) in isp_pipeline_disable()
979 static int __maybe_unused isp_suspend_modules(struct isp_device *isp) in isp_suspend_modules() argument
983 omap3isp_stat_suspend(&isp->isp_aewb); in isp_suspend_modules()
984 omap3isp_stat_suspend(&isp->isp_af); in isp_suspend_modules()
985 omap3isp_stat_suspend(&isp->isp_hist); in isp_suspend_modules()
986 isp_suspend_module_pipeline(&isp->isp_res.subdev.entity); in isp_suspend_modules()
987 isp_suspend_module_pipeline(&isp->isp_prev.subdev.entity); in isp_suspend_modules()
988 isp_suspend_module_pipeline(&isp->isp_ccdc.subdev.entity); in isp_suspend_modules()
989 isp_suspend_module_pipeline(&isp->isp_csi2a.subdev.entity); in isp_suspend_modules()
990 isp_suspend_module_pipeline(&isp->isp_ccp2.subdev.entity); in isp_suspend_modules()
993 while (omap3isp_stat_busy(&isp->isp_af) in isp_suspend_modules()
994 || omap3isp_stat_busy(&isp->isp_aewb) in isp_suspend_modules()
995 || omap3isp_stat_busy(&isp->isp_hist) in isp_suspend_modules()
996 || omap3isp_preview_busy(&isp->isp_prev) in isp_suspend_modules()
997 || omap3isp_resizer_busy(&isp->isp_res) in isp_suspend_modules()
998 || omap3isp_ccdc_busy(&isp->isp_ccdc)) { in isp_suspend_modules()
1000 dev_info(isp->dev, "can't stop modules.\n"); in isp_suspend_modules()
1013 static void __maybe_unused isp_resume_modules(struct isp_device *isp) in isp_resume_modules() argument
1015 omap3isp_stat_resume(&isp->isp_aewb); in isp_resume_modules()
1016 omap3isp_stat_resume(&isp->isp_af); in isp_resume_modules()
1017 omap3isp_stat_resume(&isp->isp_hist); in isp_resume_modules()
1018 isp_resume_module_pipeline(&isp->isp_res.subdev.entity); in isp_resume_modules()
1019 isp_resume_module_pipeline(&isp->isp_prev.subdev.entity); in isp_resume_modules()
1020 isp_resume_module_pipeline(&isp->isp_ccdc.subdev.entity); in isp_resume_modules()
1021 isp_resume_module_pipeline(&isp->isp_csi2a.subdev.entity); in isp_resume_modules()
1022 isp_resume_module_pipeline(&isp->isp_ccp2.subdev.entity); in isp_resume_modules()
1029 static int isp_reset(struct isp_device *isp) in isp_reset() argument
1033 isp_reg_writel(isp, in isp_reset()
1034 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG) in isp_reset()
1037 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, in isp_reset()
1040 dev_alert(isp->dev, "cannot reset ISP\n"); in isp_reset()
1046 isp->stop_failure = false; in isp_reset()
1047 media_entity_enum_zero(&isp->crashed); in isp_reset()
1058 isp_save_context(struct isp_device *isp, struct isp_reg *reg_list) in isp_save_context() argument
1063 next->val = isp_reg_readl(isp, next->mmio_range, next->reg); in isp_save_context()
1073 isp_restore_context(struct isp_device *isp, struct isp_reg *reg_list) in isp_restore_context() argument
1078 isp_reg_writel(isp, next->val, next->mmio_range, next->reg); in isp_restore_context()
1088 static void isp_save_ctx(struct isp_device *isp) in isp_save_ctx() argument
1090 isp_save_context(isp, isp_reg_list); in isp_save_ctx()
1091 omap_iommu_save_ctx(isp->dev); in isp_save_ctx()
1101 static void isp_restore_ctx(struct isp_device *isp) in isp_restore_ctx() argument
1103 isp_restore_context(isp, isp_reg_list); in isp_restore_ctx()
1104 omap_iommu_restore_ctx(isp->dev); in isp_restore_ctx()
1105 omap3isp_ccdc_restore_context(isp); in isp_restore_ctx()
1106 omap3isp_preview_restore_context(isp); in isp_restore_ctx()
1122 void omap3isp_sbl_enable(struct isp_device *isp, enum isp_sbl_resource res) in omap3isp_sbl_enable() argument
1126 isp->sbl_resources |= res; in omap3isp_sbl_enable()
1128 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ) in omap3isp_sbl_enable()
1131 if (isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ) in omap3isp_sbl_enable()
1134 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE) in omap3isp_sbl_enable()
1137 if (isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE) in omap3isp_sbl_enable()
1140 if (isp->sbl_resources & OMAP3_ISP_SBL_WRITE) in omap3isp_sbl_enable()
1143 if (isp->sbl_resources & OMAP3_ISP_SBL_READ) in omap3isp_sbl_enable()
1146 isp_reg_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl); in omap3isp_sbl_enable()
1149 void omap3isp_sbl_disable(struct isp_device *isp, enum isp_sbl_resource res) in omap3isp_sbl_disable() argument
1153 isp->sbl_resources &= ~res; in omap3isp_sbl_disable()
1155 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ)) in omap3isp_sbl_disable()
1158 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ)) in omap3isp_sbl_disable()
1161 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE)) in omap3isp_sbl_disable()
1164 if (!(isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE)) in omap3isp_sbl_disable()
1167 if (!(isp->sbl_resources & OMAP3_ISP_SBL_WRITE)) in omap3isp_sbl_disable()
1170 if (!(isp->sbl_resources & OMAP3_ISP_SBL_READ)) in omap3isp_sbl_disable()
1173 isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl); in omap3isp_sbl_disable()
1263 static void __isp_subclk_update(struct isp_device *isp) in __isp_subclk_update() argument
1268 if (isp->subclk_resources & in __isp_subclk_update()
1272 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_HIST) in __isp_subclk_update()
1275 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_RESIZER) in __isp_subclk_update()
1281 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_CCDC) in __isp_subclk_update()
1284 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_PREVIEW) in __isp_subclk_update()
1287 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, in __isp_subclk_update()
1291 void omap3isp_subclk_enable(struct isp_device *isp, in omap3isp_subclk_enable() argument
1294 isp->subclk_resources |= res; in omap3isp_subclk_enable()
1296 __isp_subclk_update(isp); in omap3isp_subclk_enable()
1299 void omap3isp_subclk_disable(struct isp_device *isp, in omap3isp_subclk_disable() argument
1302 isp->subclk_resources &= ~res; in omap3isp_subclk_disable()
1304 __isp_subclk_update(isp); in omap3isp_subclk_disable()
1314 static int isp_enable_clocks(struct isp_device *isp) in isp_enable_clocks() argument
1319 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]); in isp_enable_clocks()
1321 dev_err(isp->dev, "failed to enable cam_ick clock\n"); in isp_enable_clocks()
1324 r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ); in isp_enable_clocks()
1326 dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n"); in isp_enable_clocks()
1329 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1331 dev_err(isp->dev, "failed to enable cam_mclk clock\n"); in isp_enable_clocks()
1334 rate = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1336 dev_warn(isp->dev, "unexpected cam_mclk rate:\n" in isp_enable_clocks()
1339 r = clk_prepare_enable(isp->clock[ISP_CLK_CSI2_FCK]); in isp_enable_clocks()
1341 dev_err(isp->dev, "failed to enable csi2_fck clock\n"); in isp_enable_clocks()
1347 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1349 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]); in isp_enable_clocks()
1358 static void isp_disable_clocks(struct isp_device *isp) in isp_disable_clocks() argument
1360 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]); in isp_disable_clocks()
1361 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]); in isp_disable_clocks()
1362 clk_disable_unprepare(isp->clock[ISP_CLK_CSI2_FCK]); in isp_disable_clocks()
1372 static int isp_get_clocks(struct isp_device *isp) in isp_get_clocks() argument
1378 clk = devm_clk_get(isp->dev, isp_clocks[i]); in isp_get_clocks()
1380 dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]); in isp_get_clocks()
1384 isp->clock[i] = clk; in isp_get_clocks()
1400 static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq) in __omap3isp_get() argument
1402 struct isp_device *__isp = isp; in __omap3isp_get()
1404 if (isp == NULL) in __omap3isp_get()
1407 mutex_lock(&isp->isp_mutex); in __omap3isp_get()
1408 if (isp->ref_count > 0) in __omap3isp_get()
1411 if (isp_enable_clocks(isp) < 0) { in __omap3isp_get()
1417 if (isp->has_context) in __omap3isp_get()
1418 isp_restore_ctx(isp); in __omap3isp_get()
1421 isp_enable_interrupts(isp); in __omap3isp_get()
1425 isp->ref_count++; in __omap3isp_get()
1426 mutex_unlock(&isp->isp_mutex); in __omap3isp_get()
1431 struct isp_device *omap3isp_get(struct isp_device *isp) in omap3isp_get() argument
1433 return __omap3isp_get(isp, true); in omap3isp_get()
1442 static void __omap3isp_put(struct isp_device *isp, bool save_ctx) in __omap3isp_put() argument
1444 if (isp == NULL) in __omap3isp_put()
1447 mutex_lock(&isp->isp_mutex); in __omap3isp_put()
1448 BUG_ON(isp->ref_count == 0); in __omap3isp_put()
1449 if (--isp->ref_count == 0) { in __omap3isp_put()
1450 isp_disable_interrupts(isp); in __omap3isp_put()
1452 isp_save_ctx(isp); in __omap3isp_put()
1453 isp->has_context = 1; in __omap3isp_put()
1458 if (!media_entity_enum_empty(&isp->crashed) || in __omap3isp_put()
1459 isp->stop_failure) in __omap3isp_put()
1460 isp_reset(isp); in __omap3isp_put()
1461 isp_disable_clocks(isp); in __omap3isp_put()
1463 mutex_unlock(&isp->isp_mutex); in __omap3isp_put()
1466 void omap3isp_put(struct isp_device *isp) in omap3isp_put() argument
1468 __omap3isp_put(isp, true); in omap3isp_put()
1479 #define ISP_PRINT_REGISTER(isp, name)\ argument
1480 dev_dbg(isp->dev, "###ISP " #name "=0x%08x\n", \
1481 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_##name))
1482 #define SBL_PRINT_REGISTER(isp, name)\ argument
1483 dev_dbg(isp->dev, "###SBL " #name "=0x%08x\n", \
1484 isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_##name))
1486 void omap3isp_print_status(struct isp_device *isp) in omap3isp_print_status() argument
1488 dev_dbg(isp->dev, "-------------ISP Register dump--------------\n"); in omap3isp_print_status()
1490 ISP_PRINT_REGISTER(isp, SYSCONFIG); in omap3isp_print_status()
1491 ISP_PRINT_REGISTER(isp, SYSSTATUS); in omap3isp_print_status()
1492 ISP_PRINT_REGISTER(isp, IRQ0ENABLE); in omap3isp_print_status()
1493 ISP_PRINT_REGISTER(isp, IRQ0STATUS); in omap3isp_print_status()
1494 ISP_PRINT_REGISTER(isp, TCTRL_GRESET_LENGTH); in omap3isp_print_status()
1495 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_REPLAY); in omap3isp_print_status()
1496 ISP_PRINT_REGISTER(isp, CTRL); in omap3isp_print_status()
1497 ISP_PRINT_REGISTER(isp, TCTRL_CTRL); in omap3isp_print_status()
1498 ISP_PRINT_REGISTER(isp, TCTRL_FRAME); in omap3isp_print_status()
1499 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_DELAY); in omap3isp_print_status()
1500 ISP_PRINT_REGISTER(isp, TCTRL_STRB_DELAY); in omap3isp_print_status()
1501 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_DELAY); in omap3isp_print_status()
1502 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_LENGTH); in omap3isp_print_status()
1503 ISP_PRINT_REGISTER(isp, TCTRL_STRB_LENGTH); in omap3isp_print_status()
1504 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_LENGTH); in omap3isp_print_status()
1506 SBL_PRINT_REGISTER(isp, PCR); in omap3isp_print_status()
1507 SBL_PRINT_REGISTER(isp, SDR_REQ_EXP); in omap3isp_print_status()
1509 dev_dbg(isp->dev, "--------------------------------------------\n"); in omap3isp_print_status()
1533 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_prepare() local
1536 WARN_ON(mutex_is_locked(&isp->isp_mutex)); in isp_pm_prepare()
1538 if (isp->ref_count == 0) in isp_pm_prepare()
1541 reset = isp_suspend_modules(isp); in isp_pm_prepare()
1542 isp_disable_interrupts(isp); in isp_pm_prepare()
1543 isp_save_ctx(isp); in isp_pm_prepare()
1545 isp_reset(isp); in isp_pm_prepare()
1552 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_suspend() local
1554 WARN_ON(mutex_is_locked(&isp->isp_mutex)); in isp_pm_suspend()
1556 if (isp->ref_count) in isp_pm_suspend()
1557 isp_disable_clocks(isp); in isp_pm_suspend()
1564 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_resume() local
1566 if (isp->ref_count == 0) in isp_pm_resume()
1569 return isp_enable_clocks(isp); in isp_pm_resume()
1574 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_complete() local
1576 if (isp->ref_count == 0) in isp_pm_complete()
1579 isp_restore_ctx(isp); in isp_pm_complete()
1580 isp_enable_interrupts(isp); in isp_pm_complete()
1581 isp_resume_modules(isp); in isp_pm_complete()
1593 static void isp_unregister_entities(struct isp_device *isp) in isp_unregister_entities() argument
1595 media_device_unregister(&isp->media_dev); in isp_unregister_entities()
1597 omap3isp_csi2_unregister_entities(&isp->isp_csi2a); in isp_unregister_entities()
1598 omap3isp_ccp2_unregister_entities(&isp->isp_ccp2); in isp_unregister_entities()
1599 omap3isp_ccdc_unregister_entities(&isp->isp_ccdc); in isp_unregister_entities()
1600 omap3isp_preview_unregister_entities(&isp->isp_prev); in isp_unregister_entities()
1601 omap3isp_resizer_unregister_entities(&isp->isp_res); in isp_unregister_entities()
1602 omap3isp_stat_unregister_entities(&isp->isp_aewb); in isp_unregister_entities()
1603 omap3isp_stat_unregister_entities(&isp->isp_af); in isp_unregister_entities()
1604 omap3isp_stat_unregister_entities(&isp->isp_hist); in isp_unregister_entities()
1606 v4l2_device_unregister(&isp->v4l2_dev); in isp_unregister_entities()
1607 media_device_cleanup(&isp->media_dev); in isp_unregister_entities()
1611 struct isp_device *isp, struct media_entity *entity, in isp_link_entity() argument
1626 input = &isp->isp_ccdc.subdev.entity; in isp_link_entity()
1632 input = &isp->isp_csi2a.subdev.entity; in isp_link_entity()
1639 input = &isp->isp_ccp2.subdev.entity; in isp_link_entity()
1645 input = &isp->isp_csi2c.subdev.entity; in isp_link_entity()
1651 dev_err(isp->dev, "%s: invalid interface type %u\n", __func__, in isp_link_entity()
1663 dev_err(isp->dev, "%s: invalid input %u\n", entity->name, in isp_link_entity()
1673 dev_err(isp->dev, "%s: no source pad in external entity %s\n", in isp_link_entity()
1681 static int isp_register_entities(struct isp_device *isp) in isp_register_entities() argument
1685 isp->media_dev.dev = isp->dev; in isp_register_entities()
1686 strscpy(isp->media_dev.model, "TI OMAP3 ISP", in isp_register_entities()
1687 sizeof(isp->media_dev.model)); in isp_register_entities()
1688 isp->media_dev.hw_revision = isp->revision; in isp_register_entities()
1689 isp->media_dev.ops = &isp_media_ops; in isp_register_entities()
1690 media_device_init(&isp->media_dev); in isp_register_entities()
1692 isp->v4l2_dev.mdev = &isp->media_dev; in isp_register_entities()
1693 ret = v4l2_device_register(isp->dev, &isp->v4l2_dev); in isp_register_entities()
1695 dev_err(isp->dev, "%s: V4L2 device registration failed (%d)\n", in isp_register_entities()
1701 ret = omap3isp_ccp2_register_entities(&isp->isp_ccp2, &isp->v4l2_dev); in isp_register_entities()
1705 ret = omap3isp_csi2_register_entities(&isp->isp_csi2a, &isp->v4l2_dev); in isp_register_entities()
1709 ret = omap3isp_ccdc_register_entities(&isp->isp_ccdc, &isp->v4l2_dev); in isp_register_entities()
1713 ret = omap3isp_preview_register_entities(&isp->isp_prev, in isp_register_entities()
1714 &isp->v4l2_dev); in isp_register_entities()
1718 ret = omap3isp_resizer_register_entities(&isp->isp_res, &isp->v4l2_dev); in isp_register_entities()
1722 ret = omap3isp_stat_register_entities(&isp->isp_aewb, &isp->v4l2_dev); in isp_register_entities()
1726 ret = omap3isp_stat_register_entities(&isp->isp_af, &isp->v4l2_dev); in isp_register_entities()
1730 ret = omap3isp_stat_register_entities(&isp->isp_hist, &isp->v4l2_dev); in isp_register_entities()
1736 isp_unregister_entities(isp); in isp_register_entities()
1750 static int isp_create_links(struct isp_device *isp) in isp_create_links() argument
1756 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE, in isp_create_links()
1757 &isp->isp_csi2a.video_out.video.entity, 0, 0); in isp_create_links()
1762 &isp->isp_ccp2.video_in.video.entity, 0, in isp_create_links()
1763 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SINK, 0); in isp_create_links()
1768 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF, in isp_create_links()
1769 &isp->isp_ccdc.video_out.video.entity, 0, 0); in isp_create_links()
1774 &isp->isp_prev.video_in.video.entity, 0, in isp_create_links()
1775 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0); in isp_create_links()
1780 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE, in isp_create_links()
1781 &isp->isp_prev.video_out.video.entity, 0, 0); in isp_create_links()
1786 &isp->isp_res.video_in.video.entity, 0, in isp_create_links()
1787 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_create_links()
1792 &isp->isp_res.subdev.entity, RESZ_PAD_SOURCE, in isp_create_links()
1793 &isp->isp_res.video_out.video.entity, 0, 0); in isp_create_links()
1800 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE, in isp_create_links()
1801 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0); in isp_create_links()
1806 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE, in isp_create_links()
1807 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0); in isp_create_links()
1812 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_create_links()
1813 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0); in isp_create_links()
1818 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF, in isp_create_links()
1819 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_create_links()
1824 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE, in isp_create_links()
1825 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_create_links()
1830 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_create_links()
1831 &isp->isp_aewb.subdev.entity, 0, in isp_create_links()
1837 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_create_links()
1838 &isp->isp_af.subdev.entity, 0, in isp_create_links()
1844 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_create_links()
1845 &isp->isp_hist.subdev.entity, 0, in isp_create_links()
1853 static void isp_cleanup_modules(struct isp_device *isp) in isp_cleanup_modules() argument
1855 omap3isp_h3a_aewb_cleanup(isp); in isp_cleanup_modules()
1856 omap3isp_h3a_af_cleanup(isp); in isp_cleanup_modules()
1857 omap3isp_hist_cleanup(isp); in isp_cleanup_modules()
1858 omap3isp_resizer_cleanup(isp); in isp_cleanup_modules()
1859 omap3isp_preview_cleanup(isp); in isp_cleanup_modules()
1860 omap3isp_ccdc_cleanup(isp); in isp_cleanup_modules()
1861 omap3isp_ccp2_cleanup(isp); in isp_cleanup_modules()
1862 omap3isp_csi2_cleanup(isp); in isp_cleanup_modules()
1863 omap3isp_csiphy_cleanup(isp); in isp_cleanup_modules()
1866 static int isp_initialize_modules(struct isp_device *isp) in isp_initialize_modules() argument
1870 ret = omap3isp_csiphy_init(isp); in isp_initialize_modules()
1872 dev_err(isp->dev, "CSI PHY initialization failed\n"); in isp_initialize_modules()
1876 ret = omap3isp_csi2_init(isp); in isp_initialize_modules()
1878 dev_err(isp->dev, "CSI2 initialization failed\n"); in isp_initialize_modules()
1882 ret = omap3isp_ccp2_init(isp); in isp_initialize_modules()
1885 dev_err(isp->dev, "CCP2 initialization failed\n"); in isp_initialize_modules()
1889 ret = omap3isp_ccdc_init(isp); in isp_initialize_modules()
1891 dev_err(isp->dev, "CCDC initialization failed\n"); in isp_initialize_modules()
1895 ret = omap3isp_preview_init(isp); in isp_initialize_modules()
1897 dev_err(isp->dev, "Preview initialization failed\n"); in isp_initialize_modules()
1901 ret = omap3isp_resizer_init(isp); in isp_initialize_modules()
1903 dev_err(isp->dev, "Resizer initialization failed\n"); in isp_initialize_modules()
1907 ret = omap3isp_hist_init(isp); in isp_initialize_modules()
1909 dev_err(isp->dev, "Histogram initialization failed\n"); in isp_initialize_modules()
1913 ret = omap3isp_h3a_aewb_init(isp); in isp_initialize_modules()
1915 dev_err(isp->dev, "H3A AEWB initialization failed\n"); in isp_initialize_modules()
1919 ret = omap3isp_h3a_af_init(isp); in isp_initialize_modules()
1921 dev_err(isp->dev, "H3A AF initialization failed\n"); in isp_initialize_modules()
1928 omap3isp_h3a_aewb_cleanup(isp); in isp_initialize_modules()
1930 omap3isp_hist_cleanup(isp); in isp_initialize_modules()
1932 omap3isp_resizer_cleanup(isp); in isp_initialize_modules()
1934 omap3isp_preview_cleanup(isp); in isp_initialize_modules()
1936 omap3isp_ccdc_cleanup(isp); in isp_initialize_modules()
1938 omap3isp_ccp2_cleanup(isp); in isp_initialize_modules()
1940 omap3isp_csi2_cleanup(isp); in isp_initialize_modules()
1942 omap3isp_csiphy_cleanup(isp); in isp_initialize_modules()
1947 static void isp_detach_iommu(struct isp_device *isp) in isp_detach_iommu() argument
1950 arm_iommu_detach_device(isp->dev); in isp_detach_iommu()
1951 arm_iommu_release_mapping(isp->mapping); in isp_detach_iommu()
1952 isp->mapping = NULL; in isp_detach_iommu()
1956 static int isp_attach_iommu(struct isp_device *isp) in isp_attach_iommu() argument
1968 dev_err(isp->dev, "failed to create ARM IOMMU mapping\n"); in isp_attach_iommu()
1972 isp->mapping = mapping; in isp_attach_iommu()
1975 ret = arm_iommu_attach_device(isp->dev, mapping); in isp_attach_iommu()
1977 dev_err(isp->dev, "failed to attach device to VA mapping\n"); in isp_attach_iommu()
1984 arm_iommu_release_mapping(isp->mapping); in isp_attach_iommu()
1985 isp->mapping = NULL; in isp_attach_iommu()
2000 struct isp_device *isp = platform_get_drvdata(pdev); in isp_remove() local
2002 v4l2_async_notifier_unregister(&isp->notifier); in isp_remove()
2003 isp_unregister_entities(isp); in isp_remove()
2004 isp_cleanup_modules(isp); in isp_remove()
2005 isp_xclk_cleanup(isp); in isp_remove()
2007 __omap3isp_get(isp, false); in isp_remove()
2008 isp_detach_iommu(isp); in isp_remove()
2009 __omap3isp_put(isp, false); in isp_remove()
2011 media_entity_enum_cleanup(&isp->crashed); in isp_remove()
2012 v4l2_async_notifier_cleanup(&isp->notifier); in isp_remove()
2014 kfree(isp); in isp_remove()
2027 struct isp_device *isp = container_of(async, struct isp_device, in isp_subdev_notifier_complete() local
2029 struct v4l2_device *v4l2_dev = &isp->v4l2_dev; in isp_subdev_notifier_complete()
2033 ret = media_entity_enum_init(&isp->crashed, &isp->media_dev); in isp_subdev_notifier_complete()
2038 if (sd->notifier != &isp->notifier) in isp_subdev_notifier_complete()
2041 ret = isp_link_entity(isp, &sd->entity, in isp_subdev_notifier_complete()
2047 ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev); in isp_subdev_notifier_complete()
2051 return media_device_register(&isp->media_dev); in isp_subdev_notifier_complete()
2157 static int isp_parse_of_endpoints(struct isp_device *isp) in isp_parse_of_endpoints() argument
2165 dev_fwnode(isp->dev), ISP_OF_PHY_PARALLEL, 0, in isp_parse_of_endpoints()
2174 dev_dbg(isp->dev, "parsing parallel interface\n"); in isp_parse_of_endpoints()
2185 isp_parse_of_parallel_endpoint(isp->dev, &vep, buscfg); in isp_parse_of_endpoints()
2187 &isp->notifier, ep, &isd->asd); in isp_parse_of_endpoints()
2202 dev_fwnode(isp->dev), isp_bus_interfaces[i].phy, 0, in isp_parse_of_endpoints()
2208 dev_dbg(isp->dev, "parsing serial interface %u, node %pOF\n", i, in isp_parse_of_endpoints()
2218 isp_parse_of_csi2_endpoint(isp->dev, &vep, buscfg); in isp_parse_of_endpoints()
2232 isp_parse_of_csi1_endpoint(isp->dev, &vep, in isp_parse_of_endpoints()
2239 &isp->notifier, ep, &isd->asd); in isp_parse_of_endpoints()
2266 struct isp_device *isp; in isp_probe() local
2271 isp = kzalloc(sizeof(*isp), GFP_KERNEL); in isp_probe()
2272 if (!isp) { in isp_probe()
2278 "ti,phy-type", &isp->phy_type); in isp_probe()
2282 isp->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in isp_probe()
2284 if (IS_ERR(isp->syscon)) { in isp_probe()
2285 ret = PTR_ERR(isp->syscon); in isp_probe()
2290 "syscon", 1, &isp->syscon_offset); in isp_probe()
2294 isp->autoidle = autoidle; in isp_probe()
2296 mutex_init(&isp->isp_mutex); in isp_probe()
2297 spin_lock_init(&isp->stat_lock); in isp_probe()
2298 v4l2_async_notifier_init(&isp->notifier); in isp_probe()
2299 isp->dev = &pdev->dev; in isp_probe()
2301 ret = isp_parse_of_endpoints(isp); in isp_probe()
2305 isp->ref_count = 0; in isp_probe()
2307 ret = dma_coerce_mask_and_coherent(isp->dev, DMA_BIT_MASK(32)); in isp_probe()
2311 platform_set_drvdata(pdev, isp); in isp_probe()
2314 isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy1"); in isp_probe()
2315 isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy2"); in isp_probe()
2331 isp->mmio_base[map_idx] = in isp_probe()
2332 devm_ioremap_resource(isp->dev, mem); in isp_probe()
2333 if (IS_ERR(isp->mmio_base[map_idx])) in isp_probe()
2334 return PTR_ERR(isp->mmio_base[map_idx]); in isp_probe()
2337 ret = isp_get_clocks(isp); in isp_probe()
2341 ret = clk_enable(isp->clock[ISP_CLK_CAM_ICK]); in isp_probe()
2345 isp->revision = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in isp_probe()
2346 dev_info(isp->dev, "Revision %d.%d found\n", in isp_probe()
2347 (isp->revision & 0xf0) >> 4, isp->revision & 0x0f); in isp_probe()
2349 clk_disable(isp->clock[ISP_CLK_CAM_ICK]); in isp_probe()
2351 if (__omap3isp_get(isp, false) == NULL) { in isp_probe()
2356 ret = isp_reset(isp); in isp_probe()
2360 ret = isp_xclk_init(isp); in isp_probe()
2366 if (isp->revision == isp_res_maps[m].isp_rev) in isp_probe()
2370 dev_err(isp->dev, "No resource map found for ISP rev %d.%d\n", in isp_probe()
2371 (isp->revision & 0xf0) >> 4, isp->revision & 0xf); in isp_probe()
2377 isp->mmio_base[i] = in isp_probe()
2378 isp->mmio_base[0] + isp_res_maps[m].offset[i]; in isp_probe()
2381 isp->mmio_base[i] = in isp_probe()
2382 isp->mmio_base[OMAP3_ISP_IOMEM_CSI2A_REGS1] in isp_probe()
2385 isp->mmio_hist_base_phys = in isp_probe()
2389 ret = isp_attach_iommu(isp); in isp_probe()
2401 isp->irq_num = ret; in isp_probe()
2403 if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED, in isp_probe()
2404 "OMAP3 ISP", isp)) { in isp_probe()
2405 dev_err(isp->dev, "Unable to request IRQ\n"); in isp_probe()
2411 ret = isp_initialize_modules(isp); in isp_probe()
2415 ret = isp_register_entities(isp); in isp_probe()
2419 ret = isp_create_links(isp); in isp_probe()
2423 isp->notifier.ops = &isp_subdev_notifier_ops; in isp_probe()
2425 ret = v4l2_async_notifier_register(&isp->v4l2_dev, &isp->notifier); in isp_probe()
2429 isp_core_init(isp, 1); in isp_probe()
2430 omap3isp_put(isp); in isp_probe()
2435 isp_unregister_entities(isp); in isp_probe()
2437 isp_cleanup_modules(isp); in isp_probe()
2439 isp_detach_iommu(isp); in isp_probe()
2441 isp_xclk_cleanup(isp); in isp_probe()
2442 __omap3isp_put(isp, false); in isp_probe()
2444 v4l2_async_notifier_cleanup(&isp->notifier); in isp_probe()
2445 mutex_destroy(&isp->isp_mutex); in isp_probe()
2447 kfree(isp); in isp_probe()