Lines Matching refs:isp
83 static void isp_save_ctx(struct isp_device *isp);
85 static void isp_restore_ctx(struct isp_device *isp);
148 void omap3isp_flush(struct isp_device *isp) in omap3isp_flush() argument
150 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in omap3isp_flush()
151 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in omap3isp_flush()
164 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, in isp_xclk_update()
169 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, in isp_xclk_update()
180 omap3isp_get(xclk->isp); in isp_xclk_prepare()
189 omap3isp_put(xclk->isp); in isp_xclk_unprepare()
268 dev_dbg(xclk->isp->dev, "%s: cam_xclk%c set to %lu Hz (div %u)\n", in isp_xclk_set_rate()
295 struct isp_device *isp = data; in isp_xclk_src_get() local
297 if (idx >= ARRAY_SIZE(isp->xclks)) in isp_xclk_src_get()
300 return isp->xclks[idx].clk; in isp_xclk_src_get()
303 static int isp_xclk_init(struct isp_device *isp) in isp_xclk_init() argument
305 struct device_node *np = isp->dev->of_node; in isp_xclk_init()
309 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) in isp_xclk_init()
310 isp->xclks[i].clk = ERR_PTR(-EINVAL); in isp_xclk_init()
312 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) { in isp_xclk_init()
313 struct isp_xclk *xclk = &isp->xclks[i]; in isp_xclk_init()
315 xclk->isp = isp; in isp_xclk_init()
338 of_clk_add_provider(np, isp_xclk_src_get, isp); in isp_xclk_init()
343 static void isp_xclk_cleanup(struct isp_device *isp) in isp_xclk_cleanup() argument
345 struct device_node *np = isp->dev->of_node; in isp_xclk_cleanup()
351 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) { in isp_xclk_cleanup()
352 struct isp_xclk *xclk = &isp->xclks[i]; in isp_xclk_cleanup()
367 static void isp_enable_interrupts(struct isp_device *isp) in isp_enable_interrupts() argument
382 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_enable_interrupts()
383 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE); in isp_enable_interrupts()
390 static void isp_disable_interrupts(struct isp_device *isp) in isp_disable_interrupts() argument
392 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE); in isp_disable_interrupts()
407 static void isp_core_init(struct isp_device *isp, int idle) in isp_core_init() argument
409 isp_reg_writel(isp, in isp_core_init()
413 ((isp->revision == ISP_REVISION_15_0) ? in isp_core_init()
417 isp_reg_writel(isp, in isp_core_init()
418 (isp->autoidle ? ISPCTRL_SBL_AUTOIDLE : 0) | in isp_core_init()
434 void omap3isp_configure_bridge(struct isp_device *isp, in omap3isp_configure_bridge() argument
441 ispctrl_val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); in omap3isp_configure_bridge()
473 isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); in omap3isp_configure_bridge()
476 void omap3isp_hist_dma_done(struct isp_device *isp) in omap3isp_hist_dma_done() argument
478 if (omap3isp_ccdc_busy(&isp->isp_ccdc) || in omap3isp_hist_dma_done()
479 omap3isp_stat_pcr_busy(&isp->isp_hist)) { in omap3isp_hist_dma_done()
481 atomic_set(&isp->isp_hist.buf_err, 1); in omap3isp_hist_dma_done()
482 dev_dbg(isp->dev, "hist: Out of synchronization with " in omap3isp_hist_dma_done()
487 static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus) in isp_isr_dbg() argument
525 dev_dbg(isp->dev, "ISP IRQ: "); in isp_isr_dbg()
534 static void isp_isr_sbl(struct isp_device *isp) in isp_isr_sbl() argument
536 struct device *dev = isp->dev; in isp_isr_sbl()
544 sbl_pcr = isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR); in isp_isr_sbl()
545 isp_reg_writel(isp, sbl_pcr, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR); in isp_isr_sbl()
552 pipe = to_isp_pipeline(&isp->isp_ccp2.subdev.entity); in isp_isr_sbl()
558 pipe = to_isp_pipeline(&isp->isp_csi2a.subdev.entity); in isp_isr_sbl()
564 pipe = to_isp_pipeline(&isp->isp_ccdc.subdev.entity); in isp_isr_sbl()
570 pipe = to_isp_pipeline(&isp->isp_prev.subdev.entity); in isp_isr_sbl()
579 pipe = to_isp_pipeline(&isp->isp_res.subdev.entity); in isp_isr_sbl()
585 omap3isp_stat_sbl_overflow(&isp->isp_af); in isp_isr_sbl()
588 omap3isp_stat_sbl_overflow(&isp->isp_aewb); in isp_isr_sbl()
605 struct isp_device *isp = _isp; in isp_isr() local
608 irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_isr()
609 isp_reg_writel(isp, irqstatus, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); in isp_isr()
611 isp_isr_sbl(isp); in isp_isr()
614 omap3isp_csi2_isr(&isp->isp_csi2a); in isp_isr()
617 omap3isp_ccp2_isr(&isp->isp_ccp2); in isp_isr()
620 if (isp->isp_ccdc.output & CCDC_OUTPUT_PREVIEW) in isp_isr()
621 omap3isp_preview_isr_frame_sync(&isp->isp_prev); in isp_isr()
622 if (isp->isp_ccdc.output & CCDC_OUTPUT_RESIZER) in isp_isr()
623 omap3isp_resizer_isr_frame_sync(&isp->isp_res); in isp_isr()
624 omap3isp_stat_isr_frame_sync(&isp->isp_aewb); in isp_isr()
625 omap3isp_stat_isr_frame_sync(&isp->isp_af); in isp_isr()
626 omap3isp_stat_isr_frame_sync(&isp->isp_hist); in isp_isr()
630 omap3isp_ccdc_isr(&isp->isp_ccdc, irqstatus & ccdc_events); in isp_isr()
633 if (isp->isp_prev.output & PREVIEW_OUTPUT_RESIZER) in isp_isr()
634 omap3isp_resizer_isr_frame_sync(&isp->isp_res); in isp_isr()
635 omap3isp_preview_isr(&isp->isp_prev); in isp_isr()
639 omap3isp_resizer_isr(&isp->isp_res); in isp_isr()
642 omap3isp_stat_isr(&isp->isp_aewb); in isp_isr()
645 omap3isp_stat_isr(&isp->isp_af); in isp_isr()
648 omap3isp_stat_isr(&isp->isp_hist); in isp_isr()
650 omap3isp_flush(isp); in isp_isr()
653 isp_isr_dbg(isp, irqstatus); in isp_isr()
872 struct isp_device *isp = pipe->output->isp; in isp_pipeline_enable() local
884 if (pipe->entities & isp->crashed) in isp_pipeline_enable()
911 if (subdev == &isp->isp_ccdc.subdev) { in isp_pipeline_enable()
912 v4l2_subdev_call(&isp->isp_aewb.subdev, video, in isp_pipeline_enable()
914 v4l2_subdev_call(&isp->isp_af.subdev, video, in isp_pipeline_enable()
916 v4l2_subdev_call(&isp->isp_hist.subdev, video, in isp_pipeline_enable()
925 static int isp_pipeline_wait_resizer(struct isp_device *isp) in isp_pipeline_wait_resizer() argument
927 return omap3isp_resizer_busy(&isp->isp_res); in isp_pipeline_wait_resizer()
930 static int isp_pipeline_wait_preview(struct isp_device *isp) in isp_pipeline_wait_preview() argument
932 return omap3isp_preview_busy(&isp->isp_prev); in isp_pipeline_wait_preview()
935 static int isp_pipeline_wait_ccdc(struct isp_device *isp) in isp_pipeline_wait_ccdc() argument
937 return omap3isp_stat_busy(&isp->isp_af) in isp_pipeline_wait_ccdc()
938 || omap3isp_stat_busy(&isp->isp_aewb) in isp_pipeline_wait_ccdc()
939 || omap3isp_stat_busy(&isp->isp_hist) in isp_pipeline_wait_ccdc()
940 || omap3isp_ccdc_busy(&isp->isp_ccdc); in isp_pipeline_wait_ccdc()
945 static int isp_pipeline_wait(struct isp_device *isp, in isp_pipeline_wait() argument
946 int(*busy)(struct isp_device *isp)) in isp_pipeline_wait() argument
951 if (!busy(isp)) in isp_pipeline_wait()
972 struct isp_device *isp = pipe->output->isp; in isp_pipeline_disable() local
997 if (subdev == &isp->isp_ccdc.subdev) { in isp_pipeline_disable()
998 v4l2_subdev_call(&isp->isp_aewb.subdev, in isp_pipeline_disable()
1000 v4l2_subdev_call(&isp->isp_af.subdev, in isp_pipeline_disable()
1002 v4l2_subdev_call(&isp->isp_hist.subdev, in isp_pipeline_disable()
1008 if (subdev == &isp->isp_res.subdev) in isp_pipeline_disable()
1009 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_resizer); in isp_pipeline_disable()
1010 else if (subdev == &isp->isp_prev.subdev) in isp_pipeline_disable()
1011 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_preview); in isp_pipeline_disable()
1012 else if (subdev == &isp->isp_ccdc.subdev) in isp_pipeline_disable()
1013 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_ccdc); in isp_pipeline_disable()
1028 dev_info(isp->dev, "Unable to stop %s\n", subdev->name); in isp_pipeline_disable()
1029 isp->stop_failure = true; in isp_pipeline_disable()
1030 if (subdev == &isp->isp_prev.subdev) in isp_pipeline_disable()
1031 isp->crashed |= 1U << subdev->entity.id; in isp_pipeline_disable()
1169 static int isp_suspend_modules(struct isp_device *isp) in isp_suspend_modules() argument
1173 omap3isp_stat_suspend(&isp->isp_aewb); in isp_suspend_modules()
1174 omap3isp_stat_suspend(&isp->isp_af); in isp_suspend_modules()
1175 omap3isp_stat_suspend(&isp->isp_hist); in isp_suspend_modules()
1176 isp_suspend_module_pipeline(&isp->isp_res.subdev.entity); in isp_suspend_modules()
1177 isp_suspend_module_pipeline(&isp->isp_prev.subdev.entity); in isp_suspend_modules()
1178 isp_suspend_module_pipeline(&isp->isp_ccdc.subdev.entity); in isp_suspend_modules()
1179 isp_suspend_module_pipeline(&isp->isp_csi2a.subdev.entity); in isp_suspend_modules()
1180 isp_suspend_module_pipeline(&isp->isp_ccp2.subdev.entity); in isp_suspend_modules()
1183 while (omap3isp_stat_busy(&isp->isp_af) in isp_suspend_modules()
1184 || omap3isp_stat_busy(&isp->isp_aewb) in isp_suspend_modules()
1185 || omap3isp_stat_busy(&isp->isp_hist) in isp_suspend_modules()
1186 || omap3isp_preview_busy(&isp->isp_prev) in isp_suspend_modules()
1187 || omap3isp_resizer_busy(&isp->isp_res) in isp_suspend_modules()
1188 || omap3isp_ccdc_busy(&isp->isp_ccdc)) { in isp_suspend_modules()
1190 dev_info(isp->dev, "can't stop modules.\n"); in isp_suspend_modules()
1203 static void isp_resume_modules(struct isp_device *isp) in isp_resume_modules() argument
1205 omap3isp_stat_resume(&isp->isp_aewb); in isp_resume_modules()
1206 omap3isp_stat_resume(&isp->isp_af); in isp_resume_modules()
1207 omap3isp_stat_resume(&isp->isp_hist); in isp_resume_modules()
1208 isp_resume_module_pipeline(&isp->isp_res.subdev.entity); in isp_resume_modules()
1209 isp_resume_module_pipeline(&isp->isp_prev.subdev.entity); in isp_resume_modules()
1210 isp_resume_module_pipeline(&isp->isp_ccdc.subdev.entity); in isp_resume_modules()
1211 isp_resume_module_pipeline(&isp->isp_csi2a.subdev.entity); in isp_resume_modules()
1212 isp_resume_module_pipeline(&isp->isp_ccp2.subdev.entity); in isp_resume_modules()
1219 static int isp_reset(struct isp_device *isp) in isp_reset() argument
1223 isp_reg_writel(isp, in isp_reset()
1224 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG) in isp_reset()
1227 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, in isp_reset()
1230 dev_alert(isp->dev, "cannot reset ISP\n"); in isp_reset()
1236 isp->stop_failure = false; in isp_reset()
1237 isp->crashed = 0; in isp_reset()
1248 isp_save_context(struct isp_device *isp, struct isp_reg *reg_list) in isp_save_context() argument
1253 next->val = isp_reg_readl(isp, next->mmio_range, next->reg); in isp_save_context()
1263 isp_restore_context(struct isp_device *isp, struct isp_reg *reg_list) in isp_restore_context() argument
1268 isp_reg_writel(isp, next->val, next->mmio_range, next->reg); in isp_restore_context()
1278 static void isp_save_ctx(struct isp_device *isp) in isp_save_ctx() argument
1280 isp_save_context(isp, isp_reg_list); in isp_save_ctx()
1281 omap_iommu_save_ctx(isp->dev); in isp_save_ctx()
1291 static void isp_restore_ctx(struct isp_device *isp) in isp_restore_ctx() argument
1293 isp_restore_context(isp, isp_reg_list); in isp_restore_ctx()
1294 omap_iommu_restore_ctx(isp->dev); in isp_restore_ctx()
1295 omap3isp_ccdc_restore_context(isp); in isp_restore_ctx()
1296 omap3isp_preview_restore_context(isp); in isp_restore_ctx()
1312 void omap3isp_sbl_enable(struct isp_device *isp, enum isp_sbl_resource res) in omap3isp_sbl_enable() argument
1316 isp->sbl_resources |= res; in omap3isp_sbl_enable()
1318 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ) in omap3isp_sbl_enable()
1321 if (isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ) in omap3isp_sbl_enable()
1324 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE) in omap3isp_sbl_enable()
1327 if (isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE) in omap3isp_sbl_enable()
1330 if (isp->sbl_resources & OMAP3_ISP_SBL_WRITE) in omap3isp_sbl_enable()
1333 if (isp->sbl_resources & OMAP3_ISP_SBL_READ) in omap3isp_sbl_enable()
1336 isp_reg_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl); in omap3isp_sbl_enable()
1339 void omap3isp_sbl_disable(struct isp_device *isp, enum isp_sbl_resource res) in omap3isp_sbl_disable() argument
1343 isp->sbl_resources &= ~res; in omap3isp_sbl_disable()
1345 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ)) in omap3isp_sbl_disable()
1348 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ)) in omap3isp_sbl_disable()
1351 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE)) in omap3isp_sbl_disable()
1354 if (!(isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE)) in omap3isp_sbl_disable()
1357 if (!(isp->sbl_resources & OMAP3_ISP_SBL_WRITE)) in omap3isp_sbl_disable()
1360 if (!(isp->sbl_resources & OMAP3_ISP_SBL_READ)) in omap3isp_sbl_disable()
1363 isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl); in omap3isp_sbl_disable()
1453 static void __isp_subclk_update(struct isp_device *isp) in __isp_subclk_update() argument
1458 if (isp->subclk_resources & in __isp_subclk_update()
1462 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_HIST) in __isp_subclk_update()
1465 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_RESIZER) in __isp_subclk_update()
1471 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_CCDC) in __isp_subclk_update()
1474 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_PREVIEW) in __isp_subclk_update()
1477 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, in __isp_subclk_update()
1481 void omap3isp_subclk_enable(struct isp_device *isp, in omap3isp_subclk_enable() argument
1484 isp->subclk_resources |= res; in omap3isp_subclk_enable()
1486 __isp_subclk_update(isp); in omap3isp_subclk_enable()
1489 void omap3isp_subclk_disable(struct isp_device *isp, in omap3isp_subclk_disable() argument
1492 isp->subclk_resources &= ~res; in omap3isp_subclk_disable()
1494 __isp_subclk_update(isp); in omap3isp_subclk_disable()
1504 static int isp_enable_clocks(struct isp_device *isp) in isp_enable_clocks() argument
1509 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]); in isp_enable_clocks()
1511 dev_err(isp->dev, "failed to enable cam_ick clock\n"); in isp_enable_clocks()
1514 r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ); in isp_enable_clocks()
1516 dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n"); in isp_enable_clocks()
1519 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1521 dev_err(isp->dev, "failed to enable cam_mclk clock\n"); in isp_enable_clocks()
1524 rate = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1526 dev_warn(isp->dev, "unexpected cam_mclk rate:\n" in isp_enable_clocks()
1529 r = clk_prepare_enable(isp->clock[ISP_CLK_CSI2_FCK]); in isp_enable_clocks()
1531 dev_err(isp->dev, "failed to enable csi2_fck clock\n"); in isp_enable_clocks()
1537 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]); in isp_enable_clocks()
1539 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]); in isp_enable_clocks()
1548 static void isp_disable_clocks(struct isp_device *isp) in isp_disable_clocks() argument
1550 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]); in isp_disable_clocks()
1551 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]); in isp_disable_clocks()
1552 clk_disable_unprepare(isp->clock[ISP_CLK_CSI2_FCK]); in isp_disable_clocks()
1562 static int isp_get_clocks(struct isp_device *isp) in isp_get_clocks() argument
1568 clk = devm_clk_get(isp->dev, isp_clocks[i]); in isp_get_clocks()
1570 dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]); in isp_get_clocks()
1574 isp->clock[i] = clk; in isp_get_clocks()
1590 static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq) in __omap3isp_get() argument
1592 struct isp_device *__isp = isp; in __omap3isp_get()
1594 if (isp == NULL) in __omap3isp_get()
1597 mutex_lock(&isp->isp_mutex); in __omap3isp_get()
1598 if (isp->ref_count > 0) in __omap3isp_get()
1601 if (isp_enable_clocks(isp) < 0) { in __omap3isp_get()
1607 if (isp->has_context) in __omap3isp_get()
1608 isp_restore_ctx(isp); in __omap3isp_get()
1611 isp_enable_interrupts(isp); in __omap3isp_get()
1615 isp->ref_count++; in __omap3isp_get()
1616 mutex_unlock(&isp->isp_mutex); in __omap3isp_get()
1621 struct isp_device *omap3isp_get(struct isp_device *isp) in omap3isp_get() argument
1623 return __omap3isp_get(isp, true); in omap3isp_get()
1632 static void __omap3isp_put(struct isp_device *isp, bool save_ctx) in __omap3isp_put() argument
1634 if (isp == NULL) in __omap3isp_put()
1637 mutex_lock(&isp->isp_mutex); in __omap3isp_put()
1638 BUG_ON(isp->ref_count == 0); in __omap3isp_put()
1639 if (--isp->ref_count == 0) { in __omap3isp_put()
1640 isp_disable_interrupts(isp); in __omap3isp_put()
1642 isp_save_ctx(isp); in __omap3isp_put()
1643 isp->has_context = 1; in __omap3isp_put()
1648 if (isp->crashed || isp->stop_failure) in __omap3isp_put()
1649 isp_reset(isp); in __omap3isp_put()
1650 isp_disable_clocks(isp); in __omap3isp_put()
1652 mutex_unlock(&isp->isp_mutex); in __omap3isp_put()
1655 void omap3isp_put(struct isp_device *isp) in omap3isp_put() argument
1657 __omap3isp_put(isp, true); in omap3isp_put()
1668 #define ISP_PRINT_REGISTER(isp, name)\ argument
1669 dev_dbg(isp->dev, "###ISP " #name "=0x%08x\n", \
1670 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_##name))
1671 #define SBL_PRINT_REGISTER(isp, name)\ argument
1672 dev_dbg(isp->dev, "###SBL " #name "=0x%08x\n", \
1673 isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_##name))
1675 void omap3isp_print_status(struct isp_device *isp) in omap3isp_print_status() argument
1677 dev_dbg(isp->dev, "-------------ISP Register dump--------------\n"); in omap3isp_print_status()
1679 ISP_PRINT_REGISTER(isp, SYSCONFIG); in omap3isp_print_status()
1680 ISP_PRINT_REGISTER(isp, SYSSTATUS); in omap3isp_print_status()
1681 ISP_PRINT_REGISTER(isp, IRQ0ENABLE); in omap3isp_print_status()
1682 ISP_PRINT_REGISTER(isp, IRQ0STATUS); in omap3isp_print_status()
1683 ISP_PRINT_REGISTER(isp, TCTRL_GRESET_LENGTH); in omap3isp_print_status()
1684 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_REPLAY); in omap3isp_print_status()
1685 ISP_PRINT_REGISTER(isp, CTRL); in omap3isp_print_status()
1686 ISP_PRINT_REGISTER(isp, TCTRL_CTRL); in omap3isp_print_status()
1687 ISP_PRINT_REGISTER(isp, TCTRL_FRAME); in omap3isp_print_status()
1688 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_DELAY); in omap3isp_print_status()
1689 ISP_PRINT_REGISTER(isp, TCTRL_STRB_DELAY); in omap3isp_print_status()
1690 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_DELAY); in omap3isp_print_status()
1691 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_LENGTH); in omap3isp_print_status()
1692 ISP_PRINT_REGISTER(isp, TCTRL_STRB_LENGTH); in omap3isp_print_status()
1693 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_LENGTH); in omap3isp_print_status()
1695 SBL_PRINT_REGISTER(isp, PCR); in omap3isp_print_status()
1696 SBL_PRINT_REGISTER(isp, SDR_REQ_EXP); in omap3isp_print_status()
1698 dev_dbg(isp->dev, "--------------------------------------------\n"); in omap3isp_print_status()
1722 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_prepare() local
1725 WARN_ON(mutex_is_locked(&isp->isp_mutex)); in isp_pm_prepare()
1727 if (isp->ref_count == 0) in isp_pm_prepare()
1730 reset = isp_suspend_modules(isp); in isp_pm_prepare()
1731 isp_disable_interrupts(isp); in isp_pm_prepare()
1732 isp_save_ctx(isp); in isp_pm_prepare()
1734 isp_reset(isp); in isp_pm_prepare()
1741 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_suspend() local
1743 WARN_ON(mutex_is_locked(&isp->isp_mutex)); in isp_pm_suspend()
1745 if (isp->ref_count) in isp_pm_suspend()
1746 isp_disable_clocks(isp); in isp_pm_suspend()
1753 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_resume() local
1755 if (isp->ref_count == 0) in isp_pm_resume()
1758 return isp_enable_clocks(isp); in isp_pm_resume()
1763 struct isp_device *isp = dev_get_drvdata(dev); in isp_pm_complete() local
1765 if (isp->ref_count == 0) in isp_pm_complete()
1768 isp_restore_ctx(isp); in isp_pm_complete()
1769 isp_enable_interrupts(isp); in isp_pm_complete()
1770 isp_resume_modules(isp); in isp_pm_complete()
1782 static void isp_unregister_entities(struct isp_device *isp) in isp_unregister_entities() argument
1784 omap3isp_csi2_unregister_entities(&isp->isp_csi2a); in isp_unregister_entities()
1785 omap3isp_ccp2_unregister_entities(&isp->isp_ccp2); in isp_unregister_entities()
1786 omap3isp_ccdc_unregister_entities(&isp->isp_ccdc); in isp_unregister_entities()
1787 omap3isp_preview_unregister_entities(&isp->isp_prev); in isp_unregister_entities()
1788 omap3isp_resizer_unregister_entities(&isp->isp_res); in isp_unregister_entities()
1789 omap3isp_stat_unregister_entities(&isp->isp_aewb); in isp_unregister_entities()
1790 omap3isp_stat_unregister_entities(&isp->isp_af); in isp_unregister_entities()
1791 omap3isp_stat_unregister_entities(&isp->isp_hist); in isp_unregister_entities()
1793 v4l2_device_unregister(&isp->v4l2_dev); in isp_unregister_entities()
1794 media_device_unregister(&isp->media_dev); in isp_unregister_entities()
1798 struct isp_device *isp, struct media_entity *entity, in isp_link_entity() argument
1813 input = &isp->isp_ccdc.subdev.entity; in isp_link_entity()
1819 input = &isp->isp_csi2a.subdev.entity; in isp_link_entity()
1826 input = &isp->isp_ccp2.subdev.entity; in isp_link_entity()
1832 input = &isp->isp_csi2c.subdev.entity; in isp_link_entity()
1838 dev_err(isp->dev, "%s: invalid interface type %u\n", __func__, in isp_link_entity()
1850 dev_err(isp->dev, "%s: invalid input %u\n", entity->name, in isp_link_entity()
1860 dev_err(isp->dev, "%s: no source pad in external entity\n", in isp_link_entity()
1868 static int isp_register_entities(struct isp_device *isp) in isp_register_entities() argument
1872 isp->media_dev.dev = isp->dev; in isp_register_entities()
1873 strlcpy(isp->media_dev.model, "TI OMAP3 ISP", in isp_register_entities()
1874 sizeof(isp->media_dev.model)); in isp_register_entities()
1875 isp->media_dev.hw_revision = isp->revision; in isp_register_entities()
1876 isp->media_dev.link_notify = isp_pipeline_link_notify; in isp_register_entities()
1877 ret = media_device_register(&isp->media_dev); in isp_register_entities()
1879 dev_err(isp->dev, "%s: Media device registration failed (%d)\n", in isp_register_entities()
1884 isp->v4l2_dev.mdev = &isp->media_dev; in isp_register_entities()
1885 ret = v4l2_device_register(isp->dev, &isp->v4l2_dev); in isp_register_entities()
1887 dev_err(isp->dev, "%s: V4L2 device registration failed (%d)\n", in isp_register_entities()
1893 ret = omap3isp_ccp2_register_entities(&isp->isp_ccp2, &isp->v4l2_dev); in isp_register_entities()
1897 ret = omap3isp_csi2_register_entities(&isp->isp_csi2a, &isp->v4l2_dev); in isp_register_entities()
1901 ret = omap3isp_ccdc_register_entities(&isp->isp_ccdc, &isp->v4l2_dev); in isp_register_entities()
1905 ret = omap3isp_preview_register_entities(&isp->isp_prev, in isp_register_entities()
1906 &isp->v4l2_dev); in isp_register_entities()
1910 ret = omap3isp_resizer_register_entities(&isp->isp_res, &isp->v4l2_dev); in isp_register_entities()
1914 ret = omap3isp_stat_register_entities(&isp->isp_aewb, &isp->v4l2_dev); in isp_register_entities()
1918 ret = omap3isp_stat_register_entities(&isp->isp_af, &isp->v4l2_dev); in isp_register_entities()
1922 ret = omap3isp_stat_register_entities(&isp->isp_hist, &isp->v4l2_dev); in isp_register_entities()
1928 isp_unregister_entities(isp); in isp_register_entities()
1933 static void isp_cleanup_modules(struct isp_device *isp) in isp_cleanup_modules() argument
1935 omap3isp_h3a_aewb_cleanup(isp); in isp_cleanup_modules()
1936 omap3isp_h3a_af_cleanup(isp); in isp_cleanup_modules()
1937 omap3isp_hist_cleanup(isp); in isp_cleanup_modules()
1938 omap3isp_resizer_cleanup(isp); in isp_cleanup_modules()
1939 omap3isp_preview_cleanup(isp); in isp_cleanup_modules()
1940 omap3isp_ccdc_cleanup(isp); in isp_cleanup_modules()
1941 omap3isp_ccp2_cleanup(isp); in isp_cleanup_modules()
1942 omap3isp_csi2_cleanup(isp); in isp_cleanup_modules()
1945 static int isp_initialize_modules(struct isp_device *isp) in isp_initialize_modules() argument
1949 ret = omap3isp_csiphy_init(isp); in isp_initialize_modules()
1951 dev_err(isp->dev, "CSI PHY initialization failed\n"); in isp_initialize_modules()
1955 ret = omap3isp_csi2_init(isp); in isp_initialize_modules()
1957 dev_err(isp->dev, "CSI2 initialization failed\n"); in isp_initialize_modules()
1961 ret = omap3isp_ccp2_init(isp); in isp_initialize_modules()
1963 dev_err(isp->dev, "CCP2 initialization failed\n"); in isp_initialize_modules()
1967 ret = omap3isp_ccdc_init(isp); in isp_initialize_modules()
1969 dev_err(isp->dev, "CCDC initialization failed\n"); in isp_initialize_modules()
1973 ret = omap3isp_preview_init(isp); in isp_initialize_modules()
1975 dev_err(isp->dev, "Preview initialization failed\n"); in isp_initialize_modules()
1979 ret = omap3isp_resizer_init(isp); in isp_initialize_modules()
1981 dev_err(isp->dev, "Resizer initialization failed\n"); in isp_initialize_modules()
1985 ret = omap3isp_hist_init(isp); in isp_initialize_modules()
1987 dev_err(isp->dev, "Histogram initialization failed\n"); in isp_initialize_modules()
1991 ret = omap3isp_h3a_aewb_init(isp); in isp_initialize_modules()
1993 dev_err(isp->dev, "H3A AEWB initialization failed\n"); in isp_initialize_modules()
1997 ret = omap3isp_h3a_af_init(isp); in isp_initialize_modules()
1999 dev_err(isp->dev, "H3A AF initialization failed\n"); in isp_initialize_modules()
2005 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE, in isp_initialize_modules()
2006 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0); in isp_initialize_modules()
2011 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE, in isp_initialize_modules()
2012 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0); in isp_initialize_modules()
2017 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2018 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0); in isp_initialize_modules()
2023 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF, in isp_initialize_modules()
2024 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_initialize_modules()
2029 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE, in isp_initialize_modules()
2030 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0); in isp_initialize_modules()
2035 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2036 &isp->isp_aewb.subdev.entity, 0, in isp_initialize_modules()
2042 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2043 &isp->isp_af.subdev.entity, 0, in isp_initialize_modules()
2049 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP, in isp_initialize_modules()
2050 &isp->isp_hist.subdev.entity, 0, in isp_initialize_modules()
2058 omap3isp_h3a_af_cleanup(isp); in isp_initialize_modules()
2060 omap3isp_h3a_aewb_cleanup(isp); in isp_initialize_modules()
2062 omap3isp_hist_cleanup(isp); in isp_initialize_modules()
2064 omap3isp_resizer_cleanup(isp); in isp_initialize_modules()
2066 omap3isp_preview_cleanup(isp); in isp_initialize_modules()
2068 omap3isp_ccdc_cleanup(isp); in isp_initialize_modules()
2070 omap3isp_ccp2_cleanup(isp); in isp_initialize_modules()
2072 omap3isp_csi2_cleanup(isp); in isp_initialize_modules()
2078 static void isp_detach_iommu(struct isp_device *isp) in isp_detach_iommu() argument
2080 arm_iommu_release_mapping(isp->mapping); in isp_detach_iommu()
2081 isp->mapping = NULL; in isp_detach_iommu()
2082 iommu_group_remove_device(isp->dev); in isp_detach_iommu()
2085 static int isp_attach_iommu(struct isp_device *isp) in isp_attach_iommu() argument
2094 dev_err(isp->dev, "failed to allocate IOMMU group\n"); in isp_attach_iommu()
2098 ret = iommu_group_add_device(group, isp->dev); in isp_attach_iommu()
2102 dev_err(isp->dev, "failed to add device to IPMMU group\n"); in isp_attach_iommu()
2112 dev_err(isp->dev, "failed to create ARM IOMMU mapping\n"); in isp_attach_iommu()
2117 isp->mapping = mapping; in isp_attach_iommu()
2120 ret = arm_iommu_attach_device(isp->dev, mapping); in isp_attach_iommu()
2122 dev_err(isp->dev, "failed to attach device to VA mapping\n"); in isp_attach_iommu()
2129 isp_detach_iommu(isp); in isp_attach_iommu()
2141 struct isp_device *isp = platform_get_drvdata(pdev); in isp_remove() local
2143 v4l2_async_notifier_unregister(&isp->notifier); in isp_remove()
2144 isp_unregister_entities(isp); in isp_remove()
2145 isp_cleanup_modules(isp); in isp_remove()
2146 isp_xclk_cleanup(isp); in isp_remove()
2148 __omap3isp_get(isp, false); in isp_remove()
2149 isp_detach_iommu(isp); in isp_remove()
2150 __omap3isp_put(isp, false); in isp_remove()
2281 struct isp_device *isp = container_of(async, struct isp_device, in isp_subdev_notifier_bound() local
2287 ret = isp_link_entity(isp, &subdev->entity, isd->bus.interface); in isp_subdev_notifier_bound()
2299 struct isp_device *isp = container_of(async, struct isp_device, in isp_subdev_notifier_complete() local
2302 return v4l2_device_register_subdev_nodes(&isp->v4l2_dev); in isp_subdev_notifier_complete()
2318 struct isp_device *isp; in isp_probe() local
2323 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); in isp_probe()
2324 if (!isp) { in isp_probe()
2330 &isp->phy_type); in isp_probe()
2334 isp->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in isp_probe()
2336 if (IS_ERR(isp->syscon)) in isp_probe()
2337 return PTR_ERR(isp->syscon); in isp_probe()
2340 &isp->syscon_offset); in isp_probe()
2344 ret = isp_of_parse_nodes(&pdev->dev, &isp->notifier); in isp_probe()
2348 isp->autoidle = autoidle; in isp_probe()
2350 mutex_init(&isp->isp_mutex); in isp_probe()
2351 spin_lock_init(&isp->stat_lock); in isp_probe()
2353 isp->dev = &pdev->dev; in isp_probe()
2354 isp->ref_count = 0; in isp_probe()
2356 ret = dma_coerce_mask_and_coherent(isp->dev, DMA_BIT_MASK(32)); in isp_probe()
2360 platform_set_drvdata(pdev, isp); in isp_probe()
2363 isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy1"); in isp_probe()
2364 isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy2"); in isp_probe()
2380 isp->mmio_base[map_idx] = in isp_probe()
2381 devm_ioremap_resource(isp->dev, mem); in isp_probe()
2382 if (IS_ERR(isp->mmio_base[map_idx])) in isp_probe()
2383 return PTR_ERR(isp->mmio_base[map_idx]); in isp_probe()
2386 ret = isp_get_clocks(isp); in isp_probe()
2390 ret = clk_enable(isp->clock[ISP_CLK_CAM_ICK]); in isp_probe()
2394 isp->revision = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION); in isp_probe()
2395 dev_info(isp->dev, "Revision %d.%d found\n", in isp_probe()
2396 (isp->revision & 0xf0) >> 4, isp->revision & 0x0f); in isp_probe()
2398 clk_disable(isp->clock[ISP_CLK_CAM_ICK]); in isp_probe()
2400 if (__omap3isp_get(isp, false) == NULL) { in isp_probe()
2405 ret = isp_reset(isp); in isp_probe()
2409 ret = isp_xclk_init(isp); in isp_probe()
2415 if (isp->revision == isp_res_maps[m].isp_rev) in isp_probe()
2419 dev_err(isp->dev, "No resource map found for ISP rev %d.%d\n", in isp_probe()
2420 (isp->revision & 0xf0) >> 4, isp->revision & 0xf); in isp_probe()
2426 isp->mmio_base[i] = in isp_probe()
2427 isp->mmio_base[0] + isp_res_maps[m].offset[i]; in isp_probe()
2430 isp->mmio_base[i] = in isp_probe()
2431 isp->mmio_base[OMAP3_ISP_IOMEM_CSI2A_REGS1] in isp_probe()
2434 isp->mmio_hist_base_phys = in isp_probe()
2438 ret = isp_attach_iommu(isp); in isp_probe()
2445 isp->irq_num = platform_get_irq(pdev, 0); in isp_probe()
2446 if (isp->irq_num <= 0) { in isp_probe()
2447 dev_err(isp->dev, "No IRQ resource\n"); in isp_probe()
2452 if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED, in isp_probe()
2453 "OMAP3 ISP", isp)) { in isp_probe()
2454 dev_err(isp->dev, "Unable to request IRQ\n"); in isp_probe()
2460 ret = isp_initialize_modules(isp); in isp_probe()
2464 ret = isp_register_entities(isp); in isp_probe()
2468 isp->notifier.bound = isp_subdev_notifier_bound; in isp_probe()
2469 isp->notifier.complete = isp_subdev_notifier_complete; in isp_probe()
2471 ret = v4l2_async_notifier_register(&isp->v4l2_dev, &isp->notifier); in isp_probe()
2475 isp_core_init(isp, 1); in isp_probe()
2476 omap3isp_put(isp); in isp_probe()
2481 isp_unregister_entities(isp); in isp_probe()
2483 isp_cleanup_modules(isp); in isp_probe()
2485 isp_detach_iommu(isp); in isp_probe()
2487 isp_xclk_cleanup(isp); in isp_probe()
2488 __omap3isp_put(isp, false); in isp_probe()
2490 mutex_destroy(&isp->isp_mutex); in isp_probe()