Lines Matching defs:csis
37 #define CSIS_DRIVER_NAME "imx-mipi-csis"
511 static inline u32 mipi_csis_read(struct mipi_csis_device *csis, u32 reg)
513 return readl(csis->regs + reg);
516 static inline void mipi_csis_write(struct mipi_csis_device *csis, u32 reg,
519 writel(val, csis->regs + reg);
522 static void mipi_csis_enable_interrupts(struct mipi_csis_device *csis, bool on)
524 mipi_csis_write(csis, MIPI_CSIS_INT_MSK, on ? 0xffffffff : 0);
525 mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_MSK, on ? 0xffffffff : 0);
528 static void mipi_csis_sw_reset(struct mipi_csis_device *csis)
530 u32 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
532 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL,
537 static void mipi_csis_system_enable(struct mipi_csis_device *csis, int on)
541 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
546 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, val);
548 val = mipi_csis_read(csis, MIPI_CSIS_DPHY_CMN_CTRL);
551 mask = (1 << (csis->bus.num_data_lanes + 1)) - 1;
554 mipi_csis_write(csis, MIPI_CSIS_DPHY_CMN_CTRL, val);
557 static void __mipi_csis_set_format(struct mipi_csis_device *csis,
564 val = mipi_csis_read(csis, MIPI_CSIS_ISP_CONFIG_CH(0));
585 mipi_csis_write(csis, MIPI_CSIS_ISP_CONFIG_CH(0), val);
589 mipi_csis_write(csis, MIPI_CSIS_ISP_RESOL_CH(0), val);
592 static int mipi_csis_calculate_params(struct mipi_csis_device *csis,
599 link_freq = v4l2_get_link_freq(csis->src_sd->ctrl_handler,
601 csis->bus.num_data_lanes * 2);
603 dev_err(csis->dev, "Unable to obtain link frequency: %d\n",
611 dev_dbg(csis->dev, "Out-of-bound lane rate %u\n", lane_rate);
621 csis->hs_settle = (lane_rate - 5000000) / 45000000;
622 csis->clk_settle = 0;
624 dev_dbg(csis->dev, "lane rate %u, Tclk_settle %u, Ths_settle %u\n",
625 lane_rate, csis->clk_settle, csis->hs_settle);
627 if (csis->debug.hs_settle < 0xff) {
628 dev_dbg(csis->dev, "overriding Ths_settle with %u\n",
629 csis->debug.hs_settle);
630 csis->hs_settle = csis->debug.hs_settle;
633 if (csis->debug.clk_settle < 4) {
634 dev_dbg(csis->dev, "overriding Tclk_settle with %u\n",
635 csis->debug.clk_settle);
636 csis->clk_settle = csis->debug.clk_settle;
642 static void mipi_csis_set_params(struct mipi_csis_device *csis,
646 int lanes = csis->bus.num_data_lanes;
649 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
652 if (csis->info->version == MIPI_CSIS_V3_3)
654 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, val);
656 __mipi_csis_set_format(csis, format, csis_fmt);
658 mipi_csis_write(csis, MIPI_CSIS_DPHY_CMN_CTRL,
659 MIPI_CSIS_DPHY_CMN_CTRL_HSSETTLE(csis->hs_settle) |
660 MIPI_CSIS_DPHY_CMN_CTRL_CLKSETTLE(csis->clk_settle));
665 mipi_csis_write(csis, MIPI_CSIS_ISP_SYNC_CH(0), val);
667 val = mipi_csis_read(csis, MIPI_CSIS_CLK_CTRL);
671 mipi_csis_write(csis, MIPI_CSIS_CLK_CTRL, val);
673 mipi_csis_write(csis, MIPI_CSIS_DPHY_BCTRL_L,
681 mipi_csis_write(csis, MIPI_CSIS_DPHY_BCTRL_H, 0);
684 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
685 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL,
690 static int mipi_csis_clk_enable(struct mipi_csis_device *csis)
692 return clk_bulk_prepare_enable(csis->info->num_clocks, csis->clks);
695 static void mipi_csis_clk_disable(struct mipi_csis_device *csis)
697 clk_bulk_disable_unprepare(csis->info->num_clocks, csis->clks);
700 static int mipi_csis_clk_get(struct mipi_csis_device *csis)
705 csis->clks = devm_kcalloc(csis->dev, csis->info->num_clocks,
706 sizeof(*csis->clks), GFP_KERNEL);
708 if (!csis->clks)
711 for (i = 0; i < csis->info->num_clocks; i++)
712 csis->clks[i].id = mipi_csis_clk_id[i];
714 ret = devm_clk_bulk_get(csis->dev, csis->info->num_clocks,
715 csis->clks);
720 ret = clk_set_rate(csis->clks[MIPI_CSIS_CLK_WRAP].clk,
721 csis->clk_frequency);
723 dev_err(csis->dev, "set rate=%d failed: %d\n",
724 csis->clk_frequency, ret);
729 static void mipi_csis_start_stream(struct mipi_csis_device *csis,
733 mipi_csis_sw_reset(csis);
734 mipi_csis_set_params(csis, format, csis_fmt);
735 mipi_csis_system_enable(csis, true);
736 mipi_csis_enable_interrupts(csis, true);
739 static void mipi_csis_stop_stream(struct mipi_csis_device *csis)
741 mipi_csis_enable_interrupts(csis, false);
742 mipi_csis_system_enable(csis, false);
747 struct mipi_csis_device *csis = dev_id;
753 status = mipi_csis_read(csis, MIPI_CSIS_INT_SRC);
754 dbg_status = mipi_csis_read(csis, MIPI_CSIS_DBG_INTR_SRC);
756 spin_lock_irqsave(&csis->slock, flags);
759 if ((status & MIPI_CSIS_INT_SRC_ERRORS) || csis->debug.enable) {
761 struct mipi_csis_event *event = &csis->events[i];
768 spin_unlock_irqrestore(&csis->slock, flags);
770 mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status);
771 mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_SRC, dbg_status);
780 static int mipi_csis_phy_enable(struct mipi_csis_device *csis)
782 if (csis->info->version != MIPI_CSIS_V3_3)
785 return regulator_enable(csis->mipi_phy_regulator);
788 static int mipi_csis_phy_disable(struct mipi_csis_device *csis)
790 if (csis->info->version != MIPI_CSIS_V3_3)
793 return regulator_disable(csis->mipi_phy_regulator);
796 static void mipi_csis_phy_reset(struct mipi_csis_device *csis)
798 if (csis->info->version != MIPI_CSIS_V3_3)
801 reset_control_assert(csis->mrst);
803 reset_control_deassert(csis->mrst);
806 static int mipi_csis_phy_init(struct mipi_csis_device *csis)
808 if (csis->info->version != MIPI_CSIS_V3_3)
812 csis->mrst = devm_reset_control_get_exclusive(csis->dev, NULL);
813 if (IS_ERR(csis->mrst))
814 return PTR_ERR(csis->mrst);
816 csis->mipi_phy_regulator = devm_regulator_get(csis->dev, "phy");
817 if (IS_ERR(csis->mipi_phy_regulator))
818 return PTR_ERR(csis->mipi_phy_regulator);
820 return regulator_set_voltage(csis->mipi_phy_regulator, 1000000,
828 static void mipi_csis_clear_counters(struct mipi_csis_device *csis)
833 spin_lock_irqsave(&csis->slock, flags);
835 csis->events[i].counter = 0;
836 spin_unlock_irqrestore(&csis->slock, flags);
839 static void mipi_csis_log_counters(struct mipi_csis_device *csis, bool non_errors)
846 spin_lock_irqsave(&csis->slock, flags);
849 if (csis->events[i].counter > 0 || csis->debug.enable)
850 dev_info(csis->dev, "%s events: %d\n",
851 csis->events[i].name,
852 csis->events[i].counter);
854 spin_unlock_irqrestore(&csis->slock, flags);
857 static int mipi_csis_dump_regs(struct mipi_csis_device *csis)
881 if (!pm_runtime_get_if_in_use(csis->dev))
884 dev_info(csis->dev, "--- REGISTERS ---\n");
887 cfg = mipi_csis_read(csis, registers[i].offset);
888 dev_info(csis->dev, "%14s: 0x%08x\n", registers[i].name, cfg);
891 pm_runtime_put(csis->dev);
898 struct mipi_csis_device *csis = m->private;
900 return mipi_csis_dump_regs(csis);
904 static void mipi_csis_debugfs_init(struct mipi_csis_device *csis)
906 csis->debug.hs_settle = UINT_MAX;
907 csis->debug.clk_settle = UINT_MAX;
909 csis->debugfs_root = debugfs_create_dir(dev_name(csis->dev), NULL);
911 debugfs_create_bool("debug_enable", 0600, csis->debugfs_root,
912 &csis->debug.enable);
913 debugfs_create_file("dump_regs", 0600, csis->debugfs_root, csis,
915 debugfs_create_u32("tclk_settle", 0600, csis->debugfs_root,
916 &csis->debug.clk_settle);
917 debugfs_create_u32("ths_settle", 0600, csis->debugfs_root,
918 &csis->debug.hs_settle);
921 static void mipi_csis_debugfs_exit(struct mipi_csis_device *csis)
923 debugfs_remove_recursive(csis->debugfs_root);
937 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
944 v4l2_subdev_call(csis->src_sd, video, s_stream, 0);
946 mipi_csis_stop_stream(csis);
947 if (csis->debug.enable)
948 mipi_csis_log_counters(csis, true);
950 pm_runtime_put(csis->dev);
960 ret = mipi_csis_calculate_params(csis, csis_fmt);
964 mipi_csis_clear_counters(csis);
966 ret = pm_runtime_resume_and_get(csis->dev);
970 mipi_csis_start_stream(csis, format, csis_fmt);
972 ret = v4l2_subdev_call(csis->src_sd, video, s_stream, 1);
976 mipi_csis_log_counters(csis, true);
983 mipi_csis_stop_stream(csis);
984 pm_runtime_put(csis->dev);
1150 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1152 mipi_csis_log_counters(csis, true);
1153 if (csis->debug.enable)
1154 mipi_csis_dump_regs(csis);
1190 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1193 dev_dbg(csis->dev, "link setup %s -> %s", remote_pad->entity->name,
1203 if (csis->src_sd)
1206 csis->src_sd = remote_sd;
1208 csis->src_sd = NULL;
1234 struct mipi_csis_device *csis = mipi_notifier_to_csis_state(notifier);
1235 struct media_pad *sink = &csis->sd.entity.pads[CSIS_PAD_SINK];
1244 static int mipi_csis_async_register(struct mipi_csis_device *csis)
1254 v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
1256 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
1267 dev_err(csis->dev,
1274 csis->bus = vep.bus.mipi_csi2;
1276 dev_dbg(csis->dev, "data lanes: %d\n", csis->bus.num_data_lanes);
1277 dev_dbg(csis->dev, "flags: 0x%08x\n", csis->bus.flags);
1279 asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
1288 csis->notifier.ops = &mipi_csis_notify_ops;
1290 ret = v4l2_async_nf_register(&csis->notifier);
1294 return v4l2_async_register_subdev(&csis->sd);
1309 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1312 ret = mipi_csis_phy_disable(csis);
1316 mipi_csis_clk_disable(csis);
1324 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1327 ret = mipi_csis_phy_enable(csis);
1331 ret = mipi_csis_clk_enable(csis);
1333 mipi_csis_phy_disable(csis);
1349 static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
1351 struct v4l2_subdev *sd = &csis->sd;
1356 snprintf(sd->name, sizeof(sd->name), "csis-%s",
1357 dev_name(csis->dev));
1365 sd->dev = csis->dev;
1367 csis->pads[CSIS_PAD_SINK].flags = MEDIA_PAD_FL_SINK
1369 csis->pads[CSIS_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE
1371 ret = media_entity_pads_init(&sd->entity, CSIS_PADS_NUM, csis->pads);
1384 static int mipi_csis_parse_dt(struct mipi_csis_device *csis)
1386 struct device_node *node = csis->dev->of_node;
1389 &csis->clk_frequency))
1390 csis->clk_frequency = DEFAULT_SCLK_CSIS_FREQ;
1398 struct mipi_csis_device *csis;
1402 csis = devm_kzalloc(dev, sizeof(*csis), GFP_KERNEL);
1403 if (!csis)
1406 spin_lock_init(&csis->slock);
1408 csis->dev = dev;
1409 csis->info = of_device_get_match_data(dev);
1411 memcpy(csis->events, mipi_csis_events, sizeof(csis->events));
1414 ret = mipi_csis_parse_dt(csis);
1421 csis->regs = devm_platform_ioremap_resource(pdev, 0);
1422 if (IS_ERR(csis->regs))
1423 return PTR_ERR(csis->regs);
1429 ret = mipi_csis_phy_init(csis);
1433 ret = mipi_csis_clk_get(csis);
1438 mipi_csis_phy_reset(csis);
1442 dev_name(dev), csis);
1449 ret = mipi_csis_subdev_init(csis);
1453 platform_set_drvdata(pdev, &csis->sd);
1455 ret = mipi_csis_async_register(csis);
1462 mipi_csis_debugfs_init(csis);
1473 csis->bus.num_data_lanes, csis->clk_frequency);
1478 mipi_csis_debugfs_exit(csis);
1480 v4l2_subdev_cleanup(&csis->sd);
1481 media_entity_cleanup(&csis->sd.entity);
1482 v4l2_async_nf_unregister(&csis->notifier);
1483 v4l2_async_nf_cleanup(&csis->notifier);
1484 v4l2_async_unregister_subdev(&csis->sd);
1492 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1494 mipi_csis_debugfs_exit(csis);
1495 v4l2_async_nf_unregister(&csis->notifier);
1496 v4l2_async_nf_cleanup(&csis->notifier);
1497 v4l2_async_unregister_subdev(&csis->sd);
1503 v4l2_subdev_cleanup(&csis->sd);
1504 media_entity_cleanup(&csis->sd.entity);