Lines Matching defs:iss

27 #include "iss.h"
30 #define ISS_PRINT_REGISTER(iss, name)\
31 dev_dbg(iss->dev, "###ISS " #name "=0x%08x\n", \
32 iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_##name))
34 static void iss_print_status(struct iss_device *iss)
36 dev_dbg(iss->dev, "-------------ISS HL Register dump-------------\n");
38 ISS_PRINT_REGISTER(iss, HL_REVISION);
39 ISS_PRINT_REGISTER(iss, HL_SYSCONFIG);
40 ISS_PRINT_REGISTER(iss, HL_IRQSTATUS(5));
41 ISS_PRINT_REGISTER(iss, HL_IRQENABLE_SET(5));
42 ISS_PRINT_REGISTER(iss, HL_IRQENABLE_CLR(5));
43 ISS_PRINT_REGISTER(iss, CTRL);
44 ISS_PRINT_REGISTER(iss, CLKCTRL);
45 ISS_PRINT_REGISTER(iss, CLKSTAT);
47 dev_dbg(iss->dev, "-----------------------------------------------\n");
52 * @iss: OMAP4 ISS device
60 static void omap4iss_flush(struct iss_device *iss)
62 iss_reg_write(iss, OMAP4_ISS_MEM_TOP, ISS_HL_REVISION, 0);
63 iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_HL_REVISION);
68 * @iss: OMAP4 ISS device
70 static void omap4iss_isp_enable_interrupts(struct iss_device *iss)
79 iss_reg_write(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_IRQSTATUS(0), isp_irq);
80 iss_reg_write(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_IRQENABLE_SET(0),
86 * @iss: OMAP4 ISS device
88 static void omap4iss_isp_disable_interrupts(struct iss_device *iss)
90 iss_reg_write(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_IRQENABLE_CLR(0), ~0);
95 * @iss: OMAP4 ISS device
97 static void iss_enable_interrupts(struct iss_device *iss)
103 iss_reg_write(iss, OMAP4_ISS_MEM_TOP, ISS_HL_IRQSTATUS(5), hl_irq);
104 iss_reg_write(iss, OMAP4_ISS_MEM_TOP, ISS_HL_IRQENABLE_SET(5), hl_irq);
106 if (iss->regs[OMAP4_ISS_MEM_ISP_SYS1])
107 omap4iss_isp_enable_interrupts(iss);
112 * @iss: OMAP4 ISS device
114 static void iss_disable_interrupts(struct iss_device *iss)
116 if (iss->regs[OMAP4_ISS_MEM_ISP_SYS1])
117 omap4iss_isp_disable_interrupts(iss);
119 iss_reg_write(iss, OMAP4_ISS_MEM_TOP, ISS_HL_IRQENABLE_CLR(5), ~0);
125 struct iss_device *iss =
126 container_of(pipe, struct iss_video, pipe)->iss;
151 dev_warn(iss->dev, "no pixel rate control in subdev %s\n",
170 void omap4iss_configure_bridge(struct iss_device *iss,
176 issctrl_val = iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_CTRL);
180 isp5ctrl_val = iss_reg_read(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_CTRL);
200 iss_reg_write(iss, OMAP4_ISS_MEM_TOP, ISS_CTRL, issctrl_val);
201 iss_reg_write(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_CTRL, isp5ctrl_val);
205 static void iss_isr_dbg(struct iss_device *iss, u32 irqstatus)
243 dev_dbg(iss->dev, "ISS IRQ: ");
252 static void iss_isp_isr_dbg(struct iss_device *iss, u32 irqstatus)
290 dev_dbg(iss->dev, "ISP IRQ: ");
317 struct iss_device *iss = _iss;
320 irqstatus = iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_HL_IRQSTATUS(5));
321 iss_reg_write(iss, OMAP4_ISS_MEM_TOP, ISS_HL_IRQSTATUS(5), irqstatus);
324 omap4iss_csi2_isr(&iss->csi2a);
327 omap4iss_csi2_isr(&iss->csi2b);
330 u32 isp_irqstatus = iss_reg_read(iss, OMAP4_ISS_MEM_ISP_SYS1,
332 iss_reg_write(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_IRQSTATUS(0),
336 dev_dbg(iss->dev, "ISP5 OCP Error!\n");
339 omap4iss_ipipeif_isr(&iss->ipipeif,
344 omap4iss_resizer_isr(&iss->resizer,
348 iss_isp_isr_dbg(iss, isp_irqstatus);
352 omap4iss_flush(iss);
355 iss_isr_dbg(iss, irqstatus);
385 struct iss_device *iss = pipe->output->iss;
409 dev_warn(iss->dev, "%s: module stop timeout.\n",
415 media_entity_enum_set(&iss->crashed, &subdev->entity);
437 struct iss_device *iss = pipe->output->iss;
450 if (media_entity_enum_intersects(&pipe->ent_enum, &iss->crashed))
459 mutex_lock(&iss->media_dev.graph_mutex);
477 mutex_unlock(&iss->media_dev.graph_mutex);
481 if (subdev == &iss->csi2a.subdev ||
482 subdev == &iss->csi2b.subdev)
486 mutex_unlock(&iss->media_dev.graph_mutex);
487 iss_print_status(pipe->output->iss);
558 static int iss_reset(struct iss_device *iss)
562 iss_reg_set(iss, OMAP4_ISS_MEM_TOP, ISS_HL_SYSCONFIG,
566 !(iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_HL_SYSCONFIG) &
569 dev_err(iss->dev, "ISS reset timeout\n");
573 media_entity_enum_zero(&iss->crashed);
578 static int iss_isp_reset(struct iss_device *iss)
583 iss_reg_update(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_SYSCONFIG,
587 iss_reg_set(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_CTRL, ISP5_CTRL_MSTANDBY);
590 iss_reg_read(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_CTRL) &
593 dev_err(iss->dev, "ISP5 standby timeout\n");
598 iss_reg_set(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_SYSCONFIG,
602 !(iss_reg_read(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_SYSCONFIG) &
605 dev_err(iss->dev, "ISP5 reset timeout\n");
698 static int __iss_subclk_update(struct iss_device *iss)
703 if (iss->subclk_resources & OMAP4_ISS_SUBCLK_CSI2_A)
706 if (iss->subclk_resources & OMAP4_ISS_SUBCLK_CSI2_B)
709 if (iss->subclk_resources & OMAP4_ISS_SUBCLK_ISP)
712 iss_reg_update(iss, OMAP4_ISS_MEM_TOP, ISS_CLKCTRL,
718 if ((iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_CLKSTAT) &
729 int omap4iss_subclk_enable(struct iss_device *iss,
732 iss->subclk_resources |= res;
734 return __iss_subclk_update(iss);
737 int omap4iss_subclk_disable(struct iss_device *iss,
740 iss->subclk_resources &= ~res;
742 return __iss_subclk_update(iss);
752 static void __iss_isp_subclk_update(struct iss_device *iss)
756 if (iss->isp_subclk_resources & OMAP4_ISS_ISP_SUBCLK_ISIF)
759 if (iss->isp_subclk_resources & OMAP4_ISS_ISP_SUBCLK_H3A)
762 if (iss->isp_subclk_resources & OMAP4_ISS_ISP_SUBCLK_RSZ)
765 if (iss->isp_subclk_resources & OMAP4_ISS_ISP_SUBCLK_IPIPE)
768 if (iss->isp_subclk_resources & OMAP4_ISS_ISP_SUBCLK_IPIPEIF)
774 iss_reg_update(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_CTRL,
778 void omap4iss_isp_subclk_enable(struct iss_device *iss,
781 iss->isp_subclk_resources |= res;
783 __iss_isp_subclk_update(iss);
786 void omap4iss_isp_subclk_disable(struct iss_device *iss,
789 iss->isp_subclk_resources &= ~res;
791 __iss_isp_subclk_update(iss);
796 * @iss: OMAP4 ISS device
800 static int iss_enable_clocks(struct iss_device *iss)
804 ret = clk_enable(iss->iss_fck);
806 dev_err(iss->dev, "clk_enable iss_fck failed\n");
810 ret = clk_enable(iss->iss_ctrlclk);
812 dev_err(iss->dev, "clk_enable iss_ctrlclk failed\n");
813 clk_disable(iss->iss_fck);
822 * @iss: OMAP4 ISS device
824 static void iss_disable_clocks(struct iss_device *iss)
826 clk_disable(iss->iss_ctrlclk);
827 clk_disable(iss->iss_fck);
830 static int iss_get_clocks(struct iss_device *iss)
832 iss->iss_fck = devm_clk_get(iss->dev, "iss_fck");
833 if (IS_ERR(iss->iss_fck)) {
834 dev_err(iss->dev, "Unable to get iss_fck clock info\n");
835 return PTR_ERR(iss->iss_fck);
838 iss->iss_ctrlclk = devm_clk_get(iss->dev, "iss_ctrlclk");
839 if (IS_ERR(iss->iss_ctrlclk)) {
840 dev_err(iss->dev, "Unable to get iss_ctrlclk clock info\n");
841 return PTR_ERR(iss->iss_ctrlclk);
857 struct iss_device *omap4iss_get(struct iss_device *iss)
859 struct iss_device *__iss = iss;
861 if (!iss)
864 mutex_lock(&iss->iss_mutex);
865 if (iss->ref_count > 0)
868 if (iss_enable_clocks(iss) < 0) {
873 iss_enable_interrupts(iss);
877 iss->ref_count++;
878 mutex_unlock(&iss->iss_mutex);
889 void omap4iss_put(struct iss_device *iss)
891 if (!iss)
894 mutex_lock(&iss->iss_mutex);
895 WARN_ON(iss->ref_count == 0);
896 if (--iss->ref_count == 0) {
897 iss_disable_interrupts(iss);
903 if (!media_entity_enum_empty(&iss->crashed))
904 iss_reset(iss);
905 iss_disable_clocks(iss);
907 mutex_unlock(&iss->iss_mutex);
911 struct iss_device *iss,
914 iss->regs[res] = devm_platform_ioremap_resource(pdev, res);
916 return PTR_ERR_OR_ZERO(iss->regs[res]);
919 static void iss_unregister_entities(struct iss_device *iss)
921 omap4iss_resizer_unregister_entities(&iss->resizer);
922 omap4iss_ipipe_unregister_entities(&iss->ipipe);
923 omap4iss_ipipeif_unregister_entities(&iss->ipipeif);
924 omap4iss_csi2_unregister_entities(&iss->csi2a);
925 omap4iss_csi2_unregister_entities(&iss->csi2b);
927 v4l2_device_unregister(&iss->v4l2_dev);
928 media_device_unregister(&iss->media_dev);
933 * @iss: OMAP4 ISS device
943 iss_register_subdev_group(struct iss_device *iss,
958 dev_err(iss->dev,
965 subdev = v4l2_i2c_new_subdev_board(&iss->v4l2_dev, adapter,
968 dev_err(iss->dev, "Unable to register subdev %s\n",
980 static int iss_register_entities(struct iss_device *iss)
982 struct iss_platform_data *pdata = iss->pdata;
986 iss->media_dev.dev = iss->dev;
987 strscpy(iss->media_dev.model, "TI OMAP4 ISS",
988 sizeof(iss->media_dev.model));
989 iss->media_dev.hw_revision = iss->revision;
990 iss->media_dev.ops = &iss_media_ops;
991 ret = media_device_register(&iss->media_dev);
993 dev_err(iss->dev, "Media device registration failed (%d)\n",
998 iss->v4l2_dev.mdev = &iss->media_dev;
999 ret = v4l2_device_register(iss->dev, &iss->v4l2_dev);
1001 dev_err(iss->dev, "V4L2 device registration failed (%d)\n",
1007 ret = omap4iss_csi2_register_entities(&iss->csi2a, &iss->v4l2_dev);
1011 ret = omap4iss_csi2_register_entities(&iss->csi2b, &iss->v4l2_dev);
1015 ret = omap4iss_ipipeif_register_entities(&iss->ipipeif, &iss->v4l2_dev);
1019 ret = omap4iss_ipipe_register_entities(&iss->ipipe, &iss->v4l2_dev);
1023 ret = omap4iss_resizer_register_entities(&iss->resizer, &iss->v4l2_dev);
1034 sensor = iss_register_subdev_group(iss, subdevs->subdevs);
1046 input = &iss->csi2a.subdev.entity;
1053 input = &iss->csi2b.subdev.entity;
1060 dev_err(iss->dev, "invalid interface type %u\n",
1072 ret = v4l2_device_register_subdev_nodes(&iss->v4l2_dev);
1076 iss_unregister_entities(iss);
1083 * @iss : Pointer to ISS device
1087 static int iss_create_links(struct iss_device *iss)
1091 ret = omap4iss_csi2_create_links(iss);
1093 dev_err(iss->dev, "CSI2 pads links creation failed\n");
1097 ret = omap4iss_ipipeif_create_links(iss);
1099 dev_err(iss->dev, "ISP IPIPEIF pads links creation failed\n");
1103 ret = omap4iss_resizer_create_links(iss);
1105 dev_err(iss->dev, "ISP RESIZER pads links creation failed\n");
1111 &iss->csi2a.subdev.entity, CSI2_PAD_SOURCE,
1112 &iss->ipipeif.subdev.entity, IPIPEIF_PAD_SINK, 0);
1117 &iss->csi2b.subdev.entity, CSI2_PAD_SOURCE,
1118 &iss->ipipeif.subdev.entity, IPIPEIF_PAD_SINK, 0);
1123 &iss->ipipeif.subdev.entity, IPIPEIF_PAD_SOURCE_VP,
1124 &iss->resizer.subdev.entity, RESIZER_PAD_SINK, 0);
1129 &iss->ipipeif.subdev.entity, IPIPEIF_PAD_SOURCE_VP,
1130 &iss->ipipe.subdev.entity, IPIPE_PAD_SINK, 0);
1135 &iss->ipipe.subdev.entity, IPIPE_PAD_SOURCE_VP,
1136 &iss->resizer.subdev.entity, RESIZER_PAD_SINK, 0);
1143 static void iss_cleanup_modules(struct iss_device *iss)
1145 omap4iss_csi2_cleanup(iss);
1146 omap4iss_ipipeif_cleanup(iss);
1147 omap4iss_ipipe_cleanup(iss);
1148 omap4iss_resizer_cleanup(iss);
1151 static int iss_initialize_modules(struct iss_device *iss)
1155 ret = omap4iss_csiphy_init(iss);
1157 dev_err(iss->dev, "CSI PHY initialization failed\n");
1161 ret = omap4iss_csi2_init(iss);
1163 dev_err(iss->dev, "CSI2 initialization failed\n");
1167 ret = omap4iss_ipipeif_init(iss);
1169 dev_err(iss->dev, "ISP IPIPEIF initialization failed\n");
1173 ret = omap4iss_ipipe_init(iss);
1175 dev_err(iss->dev, "ISP IPIPE initialization failed\n");
1179 ret = omap4iss_resizer_init(iss);
1181 dev_err(iss->dev, "ISP RESIZER initialization failed\n");
1188 omap4iss_ipipe_cleanup(iss);
1190 omap4iss_ipipeif_cleanup(iss);
1192 omap4iss_csi2_cleanup(iss);
1201 struct iss_device *iss;
1208 iss = devm_kzalloc(&pdev->dev, sizeof(*iss), GFP_KERNEL);
1209 if (!iss)
1212 mutex_init(&iss->iss_mutex);
1214 iss->dev = &pdev->dev;
1215 iss->pdata = pdata;
1217 iss->raw_dmamask = DMA_BIT_MASK(32);
1218 iss->dev->dma_mask = &iss->raw_dmamask;
1219 iss->dev->coherent_dma_mask = DMA_BIT_MASK(32);
1221 platform_set_drvdata(pdev, iss);
1227 iss->syscon = syscon_regmap_lookup_by_compatible("syscon");
1228 if (IS_ERR(iss->syscon)) {
1229 ret = PTR_ERR(iss->syscon);
1234 ret = iss_map_mem_resource(pdev, iss, OMAP4_ISS_MEM_TOP);
1238 ret = iss_get_clocks(iss);
1242 if (!omap4iss_get(iss)) {
1247 ret = iss_reset(iss);
1251 iss->revision = iss_reg_read(iss, OMAP4_ISS_MEM_TOP, ISS_HL_REVISION);
1252 dev_info(iss->dev, "Revision %08x found\n", iss->revision);
1255 ret = iss_map_mem_resource(pdev, iss, i);
1261 iss_reg_update(iss, OMAP4_ISS_MEM_BTE, BTE_CTRL,
1266 ret = omap4iss_subclk_enable(iss, OMAP4_ISS_SUBCLK_ISP);
1270 ret = iss_isp_reset(iss);
1274 dev_info(iss->dev, "ISP Revision %08x found\n",
1275 iss_reg_read(iss, OMAP4_ISS_MEM_ISP_SYS1, ISP5_REVISION));
1283 iss->irq_num = ret;
1285 if (devm_request_irq(iss->dev, iss->irq_num, iss_isr, IRQF_SHARED,
1286 "OMAP4 ISS", iss)) {
1287 dev_err(iss->dev, "Unable to request IRQ\n");
1293 ret = iss_initialize_modules(iss);
1297 ret = iss_register_entities(iss);
1301 ret = media_entity_enum_init(&iss->crashed, &iss->media_dev);
1305 ret = iss_create_links(iss);
1309 omap4iss_put(iss);
1314 iss_unregister_entities(iss);
1315 media_entity_enum_cleanup(&iss->crashed);
1317 iss_cleanup_modules(iss);
1319 omap4iss_put(iss);
1321 mutex_destroy(&iss->iss_mutex);
1328 struct iss_device *iss = platform_get_drvdata(pdev);
1330 iss_unregister_entities(iss);
1331 media_entity_enum_cleanup(&iss->crashed);
1332 iss_cleanup_modules(iss);