Lines Matching refs:isp

83 static void isp_save_ctx(struct isp_device *isp);
85 static void isp_restore_ctx(struct isp_device *isp);
150 void omap3isp_flush(struct isp_device *isp) in omap3isp_flush() argument
152 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in omap3isp_flush()
153 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in omap3isp_flush()
166 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, in isp_xclk_update()
171 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, in isp_xclk_update()
182 omap3isp_get(xclk->isp); in isp_xclk_prepare()
191 omap3isp_put(xclk->isp); in isp_xclk_unprepare()
270 dev_dbg(xclk->isp->dev, "%s: cam_xclk%c set to %lu Hz (div %u)\n", in isp_xclk_set_rate()
297 struct isp_device *isp = data; in isp_xclk_src_get() local
299 if (idx >= ARRAY_SIZE(isp->xclks)) in isp_xclk_src_get()
302 return isp->xclks[idx].clk; in isp_xclk_src_get()
305 static int isp_xclk_init(struct isp_device *isp) in isp_xclk_init() argument
307 struct device_node *np = isp->dev->of_node; in isp_xclk_init()
311 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) in isp_xclk_init()
312 isp->xclks[i].clk = ERR_PTR(-EINVAL); in isp_xclk_init()
314 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) { in isp_xclk_init()
315 struct isp_xclk *xclk = &isp->xclks[i]; in isp_xclk_init()
317 xclk->isp = isp; in isp_xclk_init()
340 of_clk_add_provider(np, isp_xclk_src_get, isp); in isp_xclk_init()
345 static void isp_xclk_cleanup(struct isp_device *isp) in isp_xclk_cleanup() argument
347 struct device_node *np = isp->dev->of_node; in isp_xclk_cleanup()
353 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) { in isp_xclk_cleanup()
354 struct isp_xclk *xclk = &isp->xclks[i]; in isp_xclk_cleanup()
369 static void isp_enable_interrupts(struct isp_device *isp) in isp_enable_interrupts() argument
384 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_enable_interrupts()
385 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE); in isp_enable_interrupts()
392 static void isp_disable_interrupts(struct isp_device *isp) in isp_disable_interrupts() argument
394 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE); in isp_disable_interrupts()
409 static void isp_core_init(struct isp_device *isp, int idle) in isp_core_init() argument
411 isp_reg_writel(isp, in isp_core_init()
415 ((isp->revision == ISP_REVISION_15_0) ? in isp_core_init()
419 isp_reg_writel(isp, in isp_core_init()
420 (isp->autoidle ? ISPCTRL_SBL_AUTOIDLE : 0) | in isp_core_init()
436 void omap3isp_configure_bridge(struct isp_device *isp, in omap3isp_configure_bridge() argument
443 ispctrl_val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); in omap3isp_configure_bridge()
475 isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); in omap3isp_configure_bridge()
478 void omap3isp_hist_dma_done(struct isp_device *isp) in omap3isp_hist_dma_done() argument
480 if (omap3isp_ccdc_busy(&isp->isp_ccdc) || in omap3isp_hist_dma_done()
481 omap3isp_stat_pcr_busy(&isp->isp_hist)) { in omap3isp_hist_dma_done()
483 atomic_set(&isp->isp_hist.buf_err, 1); in omap3isp_hist_dma_done()
484 dev_dbg(isp->dev, "hist: Out of synchronization with " in omap3isp_hist_dma_done()
489 static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus) in isp_isr_dbg() argument
527 dev_dbg(isp->dev, "ISP IRQ: "); in isp_isr_dbg()
536 static void isp_isr_sbl(struct isp_device *isp) in isp_isr_sbl() argument
538 struct device *dev = isp->dev; in isp_isr_sbl()
546 sbl_pcr = isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR); in isp_isr_sbl()
547 isp_reg_writel(isp, sbl_pcr, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR); in isp_isr_sbl()
554 pipe = to_isp_pipeline(&isp->isp_ccp2.subdev.entity); in isp_isr_sbl()
560 pipe = to_isp_pipeline(&isp->isp_csi2a.subdev.entity); in isp_isr_sbl()
566 pipe = to_isp_pipeline(&isp->isp_ccdc.subdev.entity); in isp_isr_sbl()
572 pipe = to_isp_pipeline(&isp->isp_prev.subdev.entity); in isp_isr_sbl()
581 pipe = to_isp_pipeline(&isp->isp_res.subdev.entity); in isp_isr_sbl()
587 omap3isp_stat_sbl_overflow(&isp->isp_af); in isp_isr_sbl()
590 omap3isp_stat_sbl_overflow(&isp->isp_aewb); in isp_isr_sbl()
607 struct isp_device *isp = _isp; in isp_isr() local
610 irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_isr()
611 isp_reg_writel(isp, irqstatus, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_isr()
613 isp_isr_sbl(isp); in isp_isr()
616 omap3isp_csi2_isr(&isp->isp_csi2a); in isp_isr()
619 omap3isp_ccp2_isr(&isp->isp_ccp2); in isp_isr()
622 if (isp->isp_ccdc.output & CCDC_OUTPUT_PREVIEW) in isp_isr()
623 omap3isp_preview_isr_frame_sync(&isp->isp_prev); in isp_isr()
624 if (isp->isp_ccdc.output & CCDC_OUTPUT_RESIZER) in isp_isr()
625 omap3isp_resizer_isr_frame_sync(&isp->isp_res); in isp_isr()
626 omap3isp_stat_isr_frame_sync(&isp->isp_aewb); in isp_isr()
627 omap3isp_stat_isr_frame_sync(&isp->isp_af); in isp_isr()
628 omap3isp_stat_isr_frame_sync(&isp->isp_hist); in isp_isr()
632 omap3isp_ccdc_isr(&isp->isp_ccdc, irqstatus & ccdc_events); in isp_isr()
635 if (isp->isp_prev.output & PREVIEW_OUTPUT_RESIZER) in isp_isr()
636 omap3isp_resizer_isr_frame_sync(&isp->isp_res); in isp_isr()
637 omap3isp_preview_isr(&isp->isp_prev); in isp_isr()
641 omap3isp_resizer_isr(&isp->isp_res); in isp_isr()
644 omap3isp_stat_isr(&isp->isp_aewb); in isp_isr()
647 omap3isp_stat_isr(&isp->isp_af); in isp_isr()
650 omap3isp_stat_isr(&isp->isp_hist); in isp_isr()
652 omap3isp_flush(isp); in isp_isr()
655 isp_isr_dbg(isp, irqstatus); in isp_isr()
874 struct isp_device *isp = pipe->output->isp; in isp_pipeline_enable() local
886 if (pipe->entities & isp->crashed) in isp_pipeline_enable()
913 if (subdev == &isp->isp_ccdc.subdev) { in isp_pipeline_enable()
914 v4l2_subdev_call(&isp->isp_aewb.subdev, video, in isp_pipeline_enable()
916 v4l2_subdev_call(&isp->isp_af.subdev, video, in isp_pipeline_enable()
918 v4l2_subdev_call(&isp->isp_hist.subdev, video, in isp_pipeline_enable()
927 static int isp_pipeline_wait_resizer(struct isp_device *isp) in isp_pipeline_wait_resizer() argument
929 return omap3isp_resizer_busy(&isp->isp_res); in isp_pipeline_wait_resizer()
932 static int isp_pipeline_wait_preview(struct isp_device *isp) in isp_pipeline_wait_preview() argument
934 return omap3isp_preview_busy(&isp->isp_prev); in isp_pipeline_wait_preview()
937 static int isp_pipeline_wait_ccdc(struct isp_device *isp) in isp_pipeline_wait_ccdc() argument
939 return omap3isp_stat_busy(&isp->isp_af) in isp_pipeline_wait_ccdc()
940 || omap3isp_stat_busy(&isp->isp_aewb) in isp_pipeline_wait_ccdc()
941 || omap3isp_stat_busy(&isp->isp_hist) in isp_pipeline_wait_ccdc()
942 || omap3isp_ccdc_busy(&isp->isp_ccdc); in isp_pipeline_wait_ccdc()
947 static int isp_pipeline_wait(struct isp_device *isp, in isp_pipeline_wait() argument
948 int(*busy)(struct isp_device *isp)) in isp_pipeline_wait() argument
953 if (!busy(isp)) in isp_pipeline_wait()
974 struct isp_device *isp = pipe->output->isp; in isp_pipeline_disable() local
999 if (subdev == &isp->isp_ccdc.subdev) { in isp_pipeline_disable()
1000 v4l2_subdev_call(&isp->isp_aewb.subdev, in isp_pipeline_disable()
1002 v4l2_subdev_call(&isp->isp_af.subdev, in isp_pipeline_disable()
1004 v4l2_subdev_call(&isp->isp_hist.subdev, in isp_pipeline_disable()
1010 if (subdev == &isp->isp_res.subdev) in isp_pipeline_disable()
1011 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_resizer); in isp_pipeline_disable()
1012 else if (subdev == &isp->isp_prev.subdev) in isp_pipeline_disable()
1013 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_preview); in isp_pipeline_disable()
1014 else if (subdev == &isp->isp_ccdc.subdev) in isp_pipeline_disable()
1015 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_ccdc); in isp_pipeline_disable()
1030 dev_info(isp->dev, "Unable to stop %s\n", subdev->name); in isp_pipeline_disable()
1031 isp->stop_failure = true; in isp_pipeline_disable()
1032 if (subdev == &isp->isp_prev.subdev) in isp_pipeline_disable()
1033 isp->crashed |= 1U << subdev->entity.id; in isp_pipeline_disable()
1171 static int isp_suspend_modules(struct isp_device *isp) in isp_suspend_modules() argument
1175 omap3isp_stat_suspend(&isp->isp_aewb); in isp_suspend_modules()
1176 omap3isp_stat_suspend(&isp->isp_af); in isp_suspend_modules()
1177 omap3isp_stat_suspend(&isp->isp_hist); in isp_suspend_modules()
1178 isp_suspend_module_pipeline(&isp->isp_res.subdev.entity); in isp_suspend_modules()
1179 isp_suspend_module_pipeline(&isp->isp_prev.subdev.entity); in isp_suspend_modules()
1180 isp_suspend_module_pipeline(&isp->isp_ccdc.subdev.entity); in isp_suspend_modules()
1181 isp_suspend_module_pipeline(&isp->isp_csi2a.subdev.entity); in isp_suspend_modules()
1182 isp_suspend_module_pipeline(&isp->isp_ccp2.subdev.entity); in isp_suspend_modules()
1185 while (omap3isp_stat_busy(&isp->isp_af) in isp_suspend_modules()
1186 || omap3isp_stat_busy(&isp->isp_aewb) in isp_suspend_modules()
1187 || omap3isp_stat_busy(&isp->isp_hist) in isp_suspend_modules()
1188 || omap3isp_preview_busy(&isp->isp_prev) in isp_suspend_modules()
1189 || omap3isp_resizer_busy(&isp->isp_res) in isp_suspend_modules()
1190 || omap3isp_ccdc_busy(&isp->isp_ccdc)) { in isp_suspend_modules()
1192 dev_info(isp->dev, "can't stop modules.\n"); in isp_suspend_modules()
1205 static void isp_resume_modules(struct isp_device *isp) in isp_resume_modules() argument
1207 omap3isp_stat_resume(&isp->isp_aewb); in isp_resume_modules()
1208 omap3isp_stat_resume(&isp->isp_af); in isp_resume_modules()
1209 omap3isp_stat_resume(&isp->isp_hist); in isp_resume_modules()
1210 isp_resume_module_pipeline(&isp->isp_res.subdev.entity); in isp_resume_modules()
1211 isp_resume_module_pipeline(&isp->isp_prev.subdev.entity); in isp_resume_modules()
1212 isp_resume_module_pipeline(&isp->isp_ccdc.subdev.entity); in isp_resume_modules()
1213 isp_resume_module_pipeline(&isp->isp_csi2a.subdev.entity); in isp_resume_modules()
1214 isp_resume_module_pipeline(&isp->isp_ccp2.subdev.entity); in isp_resume_modules()
1221 static int isp_reset(struct isp_device *isp) in isp_reset() argument
1225 isp_reg_writel(isp, in isp_reset()
1226 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG) in isp_reset()
1229 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, in isp_reset()
1232 dev_alert(isp->dev, "cannot reset ISP\n"); in isp_reset()
1238 isp->stop_failure = false; in isp_reset()
1239 isp->crashed = 0; in isp_reset()
1250 isp_save_context(struct isp_device *isp, struct isp_reg *reg_list) in isp_save_context() argument
1255 next->val = isp_reg_readl(isp, next->mmio_range, next->reg); in isp_save_context()
1265 isp_restore_context(struct isp_device *isp, struct isp_reg *reg_list) in isp_restore_context() argument
1270 isp_reg_writel(isp, next->val, next->mmio_range, next->reg); in isp_restore_context()
1280 static void isp_save_ctx(struct isp_device *isp) in isp_save_ctx() argument
1282 isp_save_context(isp, isp_reg_list); in isp_save_ctx()
1283 omap_iommu_save_ctx(isp->dev); in isp_save_ctx()
1293 static void isp_restore_ctx(struct isp_device *isp) in isp_restore_ctx() argument
1295 isp_restore_context(isp, isp_reg_list); in isp_restore_ctx()
1296 omap_iommu_restore_ctx(isp->dev); in isp_restore_ctx()
1297 omap3isp_ccdc_restore_context(isp); in isp_restore_ctx()
1298 omap3isp_preview_restore_context(isp); in isp_restore_ctx()
1314 void omap3isp_sbl_enable(struct isp_device *isp, enum isp_sbl_resource res) in omap3isp_sbl_enable() argument
1318 isp->sbl_resources |= res; in omap3isp_sbl_enable()
1320 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ) in omap3isp_sbl_enable()
1323 if (isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ) in omap3isp_sbl_enable()
1326 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE) in omap3isp_sbl_enable()
1329 if (isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE) in omap3isp_sbl_enable()
1332 if (isp->sbl_resources & OMAP3_ISP_SBL_WRITE) in omap3isp_sbl_enable()
1335 if (isp->sbl_resources & OMAP3_ISP_SBL_READ) in omap3isp_sbl_enable()
1338 isp_reg_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl); in omap3isp_sbl_enable()
1341 void omap3isp_sbl_disable(struct isp_device *isp, enum isp_sbl_resource res) in omap3isp_sbl_disable() argument
1345 isp->sbl_resources &= ~res; in omap3isp_sbl_disable()
1347 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ)) in omap3isp_sbl_disable()
1350 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ)) in omap3isp_sbl_disable()
1353 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE)) in omap3isp_sbl_disable()
1356 if (!(isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE)) in omap3isp_sbl_disable()
1359 if (!(isp->sbl_resources & OMAP3_ISP_SBL_WRITE)) in omap3isp_sbl_disable()
1362 if (!(isp->sbl_resources & OMAP3_ISP_SBL_READ)) in omap3isp_sbl_disable()
1365 isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl); in omap3isp_sbl_disable()
1455 static void __isp_subclk_update(struct isp_device *isp) in __isp_subclk_update() argument
1460 if (isp->subclk_resources & in __isp_subclk_update()
1464 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_HIST) in __isp_subclk_update()
1467 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_RESIZER) in __isp_subclk_update()
1473 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_CCDC) in __isp_subclk_update()
1476 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_PREVIEW) in __isp_subclk_update()
1479 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, in __isp_subclk_update()
1483 void omap3isp_subclk_enable(struct isp_device *isp, in omap3isp_subclk_enable() argument
1486 isp->subclk_resources |= res; in omap3isp_subclk_enable()
1488 __isp_subclk_update(isp); in omap3isp_subclk_enable()
1491 void omap3isp_subclk_disable(struct isp_device *isp, in omap3isp_subclk_disable() argument
1494 isp->subclk_resources &= ~res; in omap3isp_subclk_disable()
1496 __isp_subclk_update(isp); in omap3isp_subclk_disable()
1506 static int isp_enable_clocks(struct isp_device *isp) in isp_enable_clocks() argument
1511 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]); in isp_enable_clocks()
1513 dev_err(isp->dev, "failed to enable cam_ick clock\n"); in isp_enable_clocks()
1516 r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ); in isp_enable_clocks()
1518 dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n"); in isp_enable_clocks()
1521 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1523 dev_err(isp->dev, "failed to enable cam_mclk clock\n"); in isp_enable_clocks()
1526 rate = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1528 dev_warn(isp->dev, "unexpected cam_mclk rate:\n" in isp_enable_clocks()
1531 r = clk_prepare_enable(isp->clock[ISP_CLK_CSI2_FCK]); in isp_enable_clocks()
1533 dev_err(isp->dev, "failed to enable csi2_fck clock\n"); in isp_enable_clocks()
1539 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1541 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]); in isp_enable_clocks()
1550 static void isp_disable_clocks(struct isp_device *isp) in isp_disable_clocks() argument
1552 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]); in isp_disable_clocks()
1553 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]); in isp_disable_clocks()
1554 clk_disable_unprepare(isp->clock[ISP_CLK_CSI2_FCK]); in isp_disable_clocks()
1564 static int isp_get_clocks(struct isp_device *isp) in isp_get_clocks() argument
1570 clk = devm_clk_get(isp->dev, isp_clocks[i]); in isp_get_clocks()
1572 dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]); in isp_get_clocks()
1576 isp->clock[i] = clk; in isp_get_clocks()
1592 static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq) in __omap3isp_get() argument
1594 struct isp_device *__isp = isp; in __omap3isp_get()
1596 if (isp == NULL) in __omap3isp_get()
1599 mutex_lock(&isp->isp_mutex); in __omap3isp_get()
1600 if (isp->ref_count > 0) in __omap3isp_get()
1603 if (isp_enable_clocks(isp) < 0) { in __omap3isp_get()
1609 if (isp->has_context) in __omap3isp_get()
1610 isp_restore_ctx(isp); in __omap3isp_get()
1613 isp_enable_interrupts(isp); in __omap3isp_get()
1617 isp->ref_count++; in __omap3isp_get()
1618 mutex_unlock(&isp->isp_mutex); in __omap3isp_get()
1623 struct isp_device *omap3isp_get(struct isp_device *isp) in omap3isp_get() argument
1625 return __omap3isp_get(isp, true); in omap3isp_get()
1634 static void __omap3isp_put(struct isp_device *isp, bool save_ctx) in __omap3isp_put() argument
1636 if (isp == NULL) in __omap3isp_put()
1639 mutex_lock(&isp->isp_mutex); in __omap3isp_put()
1640 BUG_ON(isp->ref_count == 0); in __omap3isp_put()
1641 if (--isp->ref_count == 0) { in __omap3isp_put()
1642 isp_disable_interrupts(isp); in __omap3isp_put()
1644 isp_save_ctx(isp); in __omap3isp_put()
1645 isp->has_context = 1; in __omap3isp_put()
1650 if (isp->crashed || isp->stop_failure) in __omap3isp_put()
1651 isp_reset(isp); in __omap3isp_put()
1652 isp_disable_clocks(isp); in __omap3isp_put()
1654 mutex_unlock(&isp->isp_mutex); in __omap3isp_put()
1657 void omap3isp_put(struct isp_device *isp) in omap3isp_put() argument
1659 __omap3isp_put(isp, true); in omap3isp_put()
1670 #define ISP_PRINT_REGISTER(isp, name)\ argument
1671 dev_dbg(isp->dev, "###ISP " #name "=0x%08x\n", \
1672 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_##name))
1673 #define SBL_PRINT_REGISTER(isp, name)\ argument
1674 dev_dbg(isp->dev, "###SBL " #name "=0x%08x\n", \
1675 isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_##name))
1677 void omap3isp_print_status(struct isp_device *isp) in omap3isp_print_status() argument
1679 dev_dbg(isp->dev, "-------------ISP Register dump--------------\n"); in omap3isp_print_status()
1681 ISP_PRINT_REGISTER(isp, SYSCONFIG); in omap3isp_print_status()
1682 ISP_PRINT_REGISTER(isp, SYSSTATUS); in omap3isp_print_status()
1683 ISP_PRINT_REGISTER(isp, IRQ0ENABLE); in omap3isp_print_status()
1684 ISP_PRINT_REGISTER(isp, IRQ0STATUS); in omap3isp_print_status()
1685 ISP_PRINT_REGISTER(isp, TCTRL_GRESET_LENGTH); in omap3isp_print_status()
1686 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_REPLAY); in omap3isp_print_status()
1687 ISP_PRINT_REGISTER(isp, CTRL); in omap3isp_print_status()
1688 ISP_PRINT_REGISTER(isp, TCTRL_CTRL); in omap3isp_print_status()
1689 ISP_PRINT_REGISTER(isp, TCTRL_FRAME); in omap3isp_print_status()
1690 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_DELAY); in omap3isp_print_status()
1691 ISP_PRINT_REGISTER(isp, TCTRL_STRB_DELAY); in omap3isp_print_status()
1692 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_DELAY); in omap3isp_print_status()
1693 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_LENGTH); in omap3isp_print_status()
1694 ISP_PRINT_REGISTER(isp, TCTRL_STRB_LENGTH); in omap3isp_print_status()
1695 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_LENGTH); in omap3isp_print_status()
1697 SBL_PRINT_REGISTER(isp, PCR); in omap3isp_print_status()
1698 SBL_PRINT_REGISTER(isp, SDR_REQ_EXP); in omap3isp_print_status()
1700 dev_dbg(isp->dev, "--------------------------------------------\n"); in omap3isp_print_status()
1724 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_prepare() local
1727 WARN_ON(mutex_is_locked(&isp->isp_mutex)); in isp_pm_prepare()
1729 if (isp->ref_count == 0) in isp_pm_prepare()
1732 reset = isp_suspend_modules(isp); in isp_pm_prepare()
1733 isp_disable_interrupts(isp); in isp_pm_prepare()
1734 isp_save_ctx(isp); in isp_pm_prepare()
1736 isp_reset(isp); in isp_pm_prepare()
1743 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_suspend() local
1745 WARN_ON(mutex_is_locked(&isp->isp_mutex)); in isp_pm_suspend()
1747 if (isp->ref_count) in isp_pm_suspend()
1748 isp_disable_clocks(isp); in isp_pm_suspend()
1755 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_resume() local
1757 if (isp->ref_count == 0) in isp_pm_resume()
1760 return isp_enable_clocks(isp); in isp_pm_resume()
1765 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_complete() local
1767 if (isp->ref_count == 0) in isp_pm_complete()
1770 isp_restore_ctx(isp); in isp_pm_complete()
1771 isp_enable_interrupts(isp); in isp_pm_complete()
1772 isp_resume_modules(isp); in isp_pm_complete()
1784 static void isp_unregister_entities(struct isp_device *isp) in isp_unregister_entities() argument
1786 omap3isp_csi2_unregister_entities(&isp->isp_csi2a); in isp_unregister_entities()
1787 omap3isp_ccp2_unregister_entities(&isp->isp_ccp2); in isp_unregister_entities()
1788 omap3isp_ccdc_unregister_entities(&isp->isp_ccdc); in isp_unregister_entities()
1789 omap3isp_preview_unregister_entities(&isp->isp_prev); in isp_unregister_entities()
1790 omap3isp_resizer_unregister_entities(&isp->isp_res); in isp_unregister_entities()
1791 omap3isp_stat_unregister_entities(&isp->isp_aewb); in isp_unregister_entities()
1792 omap3isp_stat_unregister_entities(&isp->isp_af); in isp_unregister_entities()
1793 omap3isp_stat_unregister_entities(&isp->isp_hist); in isp_unregister_entities()
1795 v4l2_device_unregister(&isp->v4l2_dev); in isp_unregister_entities()
1796 media_device_unregister(&isp->media_dev); in isp_unregister_entities()
1811 isp_register_subdev(struct isp_device *isp, in isp_register_subdev() argument
1822 dev_err(isp->dev, in isp_register_subdev()
1829 sd = v4l2_i2c_new_subdev_board(&isp->v4l2_dev, adapter, in isp_register_subdev()
1832 dev_err(isp->dev, "%s: Unable to register subdev %s\n", in isp_register_subdev()
1841 struct isp_device *isp, struct media_entity *entity, in isp_link_entity() argument
1856 input = &isp->isp_ccdc.subdev.entity; in isp_link_entity()
1862 input = &isp->isp_csi2a.subdev.entity; in isp_link_entity()
1869 input = &isp->isp_ccp2.subdev.entity; in isp_link_entity()
1875 input = &isp->isp_csi2c.subdev.entity; in isp_link_entity()
1881 dev_err(isp->dev, "%s: invalid interface type %u\n", __func__, in isp_link_entity()
1893 dev_err(isp->dev, "%s: invalid input %u\n", entity->name, in isp_link_entity()
1903 dev_err(isp->dev, "%s: no source pad in external entity\n", in isp_link_entity()
1911 static int isp_register_entities(struct isp_device *isp) in isp_register_entities() argument
1913 struct isp_platform_data *pdata = isp->pdata; in isp_register_entities()
1917 isp->media_dev.dev = isp->dev; in isp_register_entities()
1918 strlcpy(isp->media_dev.model, "TI OMAP3 ISP", in isp_register_entities()
1919 sizeof(isp->media_dev.model)); in isp_register_entities()
1920 isp->media_dev.hw_revision = isp->revision; in isp_register_entities()
1921 isp->media_dev.link_notify = isp_pipeline_link_notify; in isp_register_entities()
1922 ret = media_device_register(&isp->media_dev); in isp_register_entities()
1924 dev_err(isp->dev, "%s: Media device registration failed (%d)\n", in isp_register_entities()
1929 isp->v4l2_dev.mdev = &isp->media_dev; in isp_register_entities()
1930 ret = v4l2_device_register(isp->dev, &isp->v4l2_dev); in isp_register_entities()
1932 dev_err(isp->dev, "%s: V4L2 device registration failed (%d)\n", in isp_register_entities()
1938 ret = omap3isp_ccp2_register_entities(&isp->isp_ccp2, &isp->v4l2_dev); in isp_register_entities()
1942 ret = omap3isp_csi2_register_entities(&isp->isp_csi2a, &isp->v4l2_dev); in isp_register_entities()
1946 ret = omap3isp_ccdc_register_entities(&isp->isp_ccdc, &isp->v4l2_dev); in isp_register_entities()
1950 ret = omap3isp_preview_register_entities(&isp->isp_prev, in isp_register_entities()
1951 &isp->v4l2_dev); in isp_register_entities()
1955 ret = omap3isp_resizer_register_entities(&isp->isp_res, &isp->v4l2_dev); in isp_register_entities()
1959 ret = omap3isp_stat_register_entities(&isp->isp_aewb, &isp->v4l2_dev); in isp_register_entities()
1963 ret = omap3isp_stat_register_entities(&isp->isp_af, &isp->v4l2_dev); in isp_register_entities()
1967 ret = omap3isp_stat_register_entities(&isp->isp_hist, &isp->v4l2_dev); in isp_register_entities()
1975 if (isp->dev->of_node) in isp_register_entities()
1983 sd = isp_register_subdev(isp, isp_subdev); in isp_register_entities()
1994 ret = isp_link_entity(isp, &sd->entity, in isp_register_entities()
2000 ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev); in isp_register_entities()
2004 isp_unregister_entities(isp); in isp_register_entities()
2005 v4l2_async_notifier_unregister(&isp->notifier); in isp_register_entities()
2011 static void isp_cleanup_modules(struct isp_device *isp) in isp_cleanup_modules() argument
2013 omap3isp_h3a_aewb_cleanup(isp); in isp_cleanup_modules()
2014 omap3isp_h3a_af_cleanup(isp); in isp_cleanup_modules()
2015 omap3isp_hist_cleanup(isp); in isp_cleanup_modules()
2016 omap3isp_resizer_cleanup(isp); in isp_cleanup_modules()
2017 omap3isp_preview_cleanup(isp); in isp_cleanup_modules()
2018 omap3isp_ccdc_cleanup(isp); in isp_cleanup_modules()
2019 omap3isp_ccp2_cleanup(isp); in isp_cleanup_modules()
2020 omap3isp_csi2_cleanup(isp); in isp_cleanup_modules()
2023 static int isp_initialize_modules(struct isp_device *isp) in isp_initialize_modules() argument
2027 ret = omap3isp_csiphy_init(isp); in isp_initialize_modules()
2029 dev_err(isp->dev, "CSI PHY initialization failed\n"); in isp_initialize_modules()
2033 ret = omap3isp_csi2_init(isp); in isp_initialize_modules()
2035 dev_err(isp->dev, "CSI2 initialization failed\n"); in isp_initialize_modules()
2039 ret = omap3isp_ccp2_init(isp); in isp_initialize_modules()
2041 dev_err(isp->dev, "CCP2 initialization failed\n"); in isp_initialize_modules()
2045 ret = omap3isp_ccdc_init(isp); in isp_initialize_modules()
2047 dev_err(isp->dev, "CCDC initialization failed\n"); in isp_initialize_modules()
2051 ret = omap3isp_preview_init(isp); in isp_initialize_modules()
2053 dev_err(isp->dev, "Preview initialization failed\n"); in isp_initialize_modules()
2057 ret = omap3isp_resizer_init(isp); in isp_initialize_modules()
2059 dev_err(isp->dev, "Resizer initialization failed\n"); in isp_initialize_modules()
2063 ret = omap3isp_hist_init(isp); in isp_initialize_modules()
2065 dev_err(isp->dev, "Histogram initialization failed\n"); in isp_initialize_modules()
2069 ret = omap3isp_h3a_aewb_init(isp); in isp_initialize_modules()
2071 dev_err(isp->dev, "H3A AEWB initialization failed\n"); in isp_initialize_modules()
2075 ret = omap3isp_h3a_af_init(isp); in isp_initialize_modules()
2077 dev_err(isp->dev, "H3A AF initialization failed\n"); in isp_initialize_modules()
2083 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE, in isp_initialize_modules()
2084 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0); in isp_initialize_modules()
2089 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE, in isp_initialize_modules()
2090 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0); in isp_initialize_modules()
2095 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2096 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0); in isp_initialize_modules()
2101 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF, in isp_initialize_modules()
2102 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_initialize_modules()
2107 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE, in isp_initialize_modules()
2108 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_initialize_modules()
2113 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2114 &isp->isp_aewb.subdev.entity, 0, in isp_initialize_modules()
2120 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2121 &isp->isp_af.subdev.entity, 0, in isp_initialize_modules()
2127 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2128 &isp->isp_hist.subdev.entity, 0, in isp_initialize_modules()
2136 omap3isp_h3a_af_cleanup(isp); in isp_initialize_modules()
2138 omap3isp_h3a_aewb_cleanup(isp); in isp_initialize_modules()
2140 omap3isp_hist_cleanup(isp); in isp_initialize_modules()
2142 omap3isp_resizer_cleanup(isp); in isp_initialize_modules()
2144 omap3isp_preview_cleanup(isp); in isp_initialize_modules()
2146 omap3isp_ccdc_cleanup(isp); in isp_initialize_modules()
2148 omap3isp_ccp2_cleanup(isp); in isp_initialize_modules()
2150 omap3isp_csi2_cleanup(isp); in isp_initialize_modules()
2156 static void isp_detach_iommu(struct isp_device *isp) in isp_detach_iommu() argument
2158 arm_iommu_release_mapping(isp->mapping); in isp_detach_iommu()
2159 isp->mapping = NULL; in isp_detach_iommu()
2160 iommu_group_remove_device(isp->dev); in isp_detach_iommu()
2163 static int isp_attach_iommu(struct isp_device *isp) in isp_attach_iommu() argument
2172 dev_err(isp->dev, "failed to allocate IOMMU group\n"); in isp_attach_iommu()
2176 ret = iommu_group_add_device(group, isp->dev); in isp_attach_iommu()
2180 dev_err(isp->dev, "failed to add device to IPMMU group\n"); in isp_attach_iommu()
2190 dev_err(isp->dev, "failed to create ARM IOMMU mapping\n"); in isp_attach_iommu()
2195 isp->mapping = mapping; in isp_attach_iommu()
2198 ret = arm_iommu_attach_device(isp->dev, mapping); in isp_attach_iommu()
2200 dev_err(isp->dev, "failed to attach device to VA mapping\n"); in isp_attach_iommu()
2207 isp_detach_iommu(isp); in isp_attach_iommu()
2219 struct isp_device *isp = platform_get_drvdata(pdev); in isp_remove() local
2221 v4l2_async_notifier_unregister(&isp->notifier); in isp_remove()
2222 isp_unregister_entities(isp); in isp_remove()
2223 isp_cleanup_modules(isp); in isp_remove()
2224 isp_xclk_cleanup(isp); in isp_remove()
2226 __omap3isp_get(isp, false); in isp_remove()
2227 isp_detach_iommu(isp); in isp_remove()
2228 __omap3isp_put(isp, false); in isp_remove()
2359 struct isp_device *isp = container_of(async, struct isp_device, in isp_subdev_notifier_bound() local
2365 ret = isp_link_entity(isp, &subdev->entity, isd->bus.interface); in isp_subdev_notifier_bound()
2377 struct isp_device *isp = container_of(async, struct isp_device, in isp_subdev_notifier_complete() local
2380 return v4l2_device_register_subdev_nodes(&isp->v4l2_dev); in isp_subdev_notifier_complete()
2396 struct isp_device *isp; in isp_probe() local
2401 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); in isp_probe()
2402 if (!isp) { in isp_probe()
2409 &isp->phy_type); in isp_probe()
2413 isp->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in isp_probe()
2415 if (IS_ERR(isp->syscon)) in isp_probe()
2416 return PTR_ERR(isp->syscon); in isp_probe()
2419 &isp->syscon_offset); in isp_probe()
2423 ret = isp_of_parse_nodes(&pdev->dev, &isp->notifier); in isp_probe()
2426 ret = v4l2_async_notifier_register(&isp->v4l2_dev, in isp_probe()
2427 &isp->notifier); in isp_probe()
2431 isp->pdata = pdev->dev.platform_data; in isp_probe()
2432 isp->syscon = syscon_regmap_lookup_by_pdevname("syscon.0"); in isp_probe()
2433 if (IS_ERR(isp->syscon)) in isp_probe()
2434 return PTR_ERR(isp->syscon); in isp_probe()
2439 isp->autoidle = autoidle; in isp_probe()
2441 mutex_init(&isp->isp_mutex); in isp_probe()
2442 spin_lock_init(&isp->stat_lock); in isp_probe()
2444 isp->dev = &pdev->dev; in isp_probe()
2445 isp->ref_count = 0; in isp_probe()
2447 ret = dma_coerce_mask_and_coherent(isp->dev, DMA_BIT_MASK(32)); in isp_probe()
2451 platform_set_drvdata(pdev, isp); in isp_probe()
2454 isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy1"); in isp_probe()
2455 isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy2"); in isp_probe()
2471 isp->mmio_base[map_idx] = in isp_probe()
2472 devm_ioremap_resource(isp->dev, mem); in isp_probe()
2473 if (IS_ERR(isp->mmio_base[map_idx])) in isp_probe()
2474 return PTR_ERR(isp->mmio_base[map_idx]); in isp_probe()
2477 ret = isp_get_clocks(isp); in isp_probe()
2481 ret = clk_enable(isp->clock[ISP_CLK_CAM_ICK]); in isp_probe()
2485 isp->revision = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in isp_probe()
2486 dev_info(isp->dev, "Revision %d.%d found\n", in isp_probe()
2487 (isp->revision & 0xf0) >> 4, isp->revision & 0x0f); in isp_probe()
2489 clk_disable(isp->clock[ISP_CLK_CAM_ICK]); in isp_probe()
2491 if (__omap3isp_get(isp, false) == NULL) { in isp_probe()
2496 ret = isp_reset(isp); in isp_probe()
2500 ret = isp_xclk_init(isp); in isp_probe()
2506 if (isp->revision == isp_res_maps[m].isp_rev) in isp_probe()
2510 dev_err(isp->dev, "No resource map found for ISP rev %d.%d\n", in isp_probe()
2511 (isp->revision & 0xf0) >> 4, isp->revision & 0xf); in isp_probe()
2517 isp->syscon_offset = isp_res_maps[m].syscon_offset; in isp_probe()
2518 isp->phy_type = isp_res_maps[m].phy_type; in isp_probe()
2522 isp->mmio_base[i] = in isp_probe()
2523 isp->mmio_base[0] + isp_res_maps[m].offset[i]; in isp_probe()
2526 isp->mmio_base[i] = in isp_probe()
2527 isp->mmio_base[OMAP3_ISP_IOMEM_CSI2A_REGS1] in isp_probe()
2530 isp->mmio_hist_base_phys = in isp_probe()
2534 ret = isp_attach_iommu(isp); in isp_probe()
2541 isp->irq_num = platform_get_irq(pdev, 0); in isp_probe()
2542 if (isp->irq_num <= 0) { in isp_probe()
2543 dev_err(isp->dev, "No IRQ resource\n"); in isp_probe()
2548 if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED, in isp_probe()
2549 "OMAP3 ISP", isp)) { in isp_probe()
2550 dev_err(isp->dev, "Unable to request IRQ\n"); in isp_probe()
2556 ret = isp_initialize_modules(isp); in isp_probe()
2560 isp->notifier.bound = isp_subdev_notifier_bound; in isp_probe()
2561 isp->notifier.complete = isp_subdev_notifier_complete; in isp_probe()
2563 ret = isp_register_entities(isp); in isp_probe()
2567 isp_core_init(isp, 1); in isp_probe()
2568 omap3isp_put(isp); in isp_probe()
2573 isp_cleanup_modules(isp); in isp_probe()
2575 isp_detach_iommu(isp); in isp_probe()
2577 isp_xclk_cleanup(isp); in isp_probe()
2578 __omap3isp_put(isp, false); in isp_probe()
2580 mutex_destroy(&isp->isp_mutex); in isp_probe()