Lines Matching defs:csis
39 #define CSIS_DRIVER_NAME "imx-mipi-csis"
498 static inline u32 mipi_csis_read(struct mipi_csis_device *csis, u32 reg)
500 return readl(csis->regs + reg);
503 static inline void mipi_csis_write(struct mipi_csis_device *csis, u32 reg,
506 writel(val, csis->regs + reg);
509 static void mipi_csis_enable_interrupts(struct mipi_csis_device *csis, bool on)
511 mipi_csis_write(csis, MIPI_CSIS_INT_MSK, on ? 0xffffffff : 0);
512 mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_MSK, on ? 0xffffffff : 0);
515 static void mipi_csis_sw_reset(struct mipi_csis_device *csis)
517 u32 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
519 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL,
524 static void mipi_csis_system_enable(struct mipi_csis_device *csis, int on)
528 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
533 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, val);
535 val = mipi_csis_read(csis, MIPI_CSIS_DPHY_CMN_CTRL);
538 mask = (1 << (csis->bus.num_data_lanes + 1)) - 1;
541 mipi_csis_write(csis, MIPI_CSIS_DPHY_CMN_CTRL, val);
544 static void __mipi_csis_set_format(struct mipi_csis_device *csis,
551 val = mipi_csis_read(csis, MIPI_CSIS_ISP_CONFIG_CH(0));
572 mipi_csis_write(csis, MIPI_CSIS_ISP_CONFIG_CH(0), val);
576 mipi_csis_write(csis, MIPI_CSIS_ISP_RESOL_CH(0), val);
579 static int mipi_csis_calculate_params(struct mipi_csis_device *csis,
583 &csis->source.sd->entity.pads[csis->source.pad->index];
589 csis->bus.num_data_lanes * 2);
591 dev_err(csis->dev, "Unable to obtain link frequency: %d\n",
599 dev_dbg(csis->dev, "Out-of-bound lane rate %u\n", lane_rate);
609 csis->hs_settle = (lane_rate - 5000000) / 45000000;
610 csis->clk_settle = 0;
612 dev_dbg(csis->dev, "lane rate %u, Tclk_settle %u, Ths_settle %u\n",
613 lane_rate, csis->clk_settle, csis->hs_settle);
615 if (csis->debug.hs_settle < 0xff) {
616 dev_dbg(csis->dev, "overriding Ths_settle with %u\n",
617 csis->debug.hs_settle);
618 csis->hs_settle = csis->debug.hs_settle;
621 if (csis->debug.clk_settle < 4) {
622 dev_dbg(csis->dev, "overriding Tclk_settle with %u\n",
623 csis->debug.clk_settle);
624 csis->clk_settle = csis->debug.clk_settle;
630 static void mipi_csis_set_params(struct mipi_csis_device *csis,
634 int lanes = csis->bus.num_data_lanes;
637 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
640 if (csis->info->version == MIPI_CSIS_V3_3)
642 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, val);
644 __mipi_csis_set_format(csis, format, csis_fmt);
646 mipi_csis_write(csis, MIPI_CSIS_DPHY_CMN_CTRL,
647 MIPI_CSIS_DPHY_CMN_CTRL_HSSETTLE(csis->hs_settle) |
648 MIPI_CSIS_DPHY_CMN_CTRL_CLKSETTLE(csis->clk_settle));
653 mipi_csis_write(csis, MIPI_CSIS_ISP_SYNC_CH(0), val);
655 val = mipi_csis_read(csis, MIPI_CSIS_CLK_CTRL);
659 mipi_csis_write(csis, MIPI_CSIS_CLK_CTRL, val);
661 mipi_csis_write(csis, MIPI_CSIS_DPHY_BCTRL_L,
669 mipi_csis_write(csis, MIPI_CSIS_DPHY_BCTRL_H, 0);
672 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL);
673 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL,
678 static int mipi_csis_clk_enable(struct mipi_csis_device *csis)
680 return clk_bulk_prepare_enable(csis->info->num_clocks, csis->clks);
683 static void mipi_csis_clk_disable(struct mipi_csis_device *csis)
685 clk_bulk_disable_unprepare(csis->info->num_clocks, csis->clks);
688 static int mipi_csis_clk_get(struct mipi_csis_device *csis)
693 csis->clks = devm_kcalloc(csis->dev, csis->info->num_clocks,
694 sizeof(*csis->clks), GFP_KERNEL);
696 if (!csis->clks)
699 for (i = 0; i < csis->info->num_clocks; i++)
700 csis->clks[i].id = mipi_csis_clk_id[i];
702 ret = devm_clk_bulk_get(csis->dev, csis->info->num_clocks,
703 csis->clks);
708 ret = clk_set_rate(csis->clks[MIPI_CSIS_CLK_WRAP].clk,
709 csis->clk_frequency);
711 dev_err(csis->dev, "set rate=%d failed: %d\n",
712 csis->clk_frequency, ret);
717 static void mipi_csis_start_stream(struct mipi_csis_device *csis,
721 mipi_csis_sw_reset(csis);
722 mipi_csis_set_params(csis, format, csis_fmt);
723 mipi_csis_system_enable(csis, true);
724 mipi_csis_enable_interrupts(csis, true);
727 static void mipi_csis_stop_stream(struct mipi_csis_device *csis)
729 mipi_csis_enable_interrupts(csis, false);
730 mipi_csis_system_enable(csis, false);
733 static void mipi_csis_queue_event_sof(struct mipi_csis_device *csis)
740 frame = mipi_csis_read(csis, MIPI_CSIS_FRAME_COUNTER_CH(0));
742 v4l2_event_queue(csis->sd.devnode, &event);
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];
770 mipi_csis_queue_event_sof(csis);
772 spin_unlock_irqrestore(&csis->slock, flags);
774 mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status);
775 mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_SRC, dbg_status);
784 static int mipi_csis_phy_enable(struct mipi_csis_device *csis)
786 if (csis->info->version != MIPI_CSIS_V3_3)
789 return regulator_enable(csis->mipi_phy_regulator);
792 static int mipi_csis_phy_disable(struct mipi_csis_device *csis)
794 if (csis->info->version != MIPI_CSIS_V3_3)
797 return regulator_disable(csis->mipi_phy_regulator);
800 static void mipi_csis_phy_reset(struct mipi_csis_device *csis)
802 if (csis->info->version != MIPI_CSIS_V3_3)
805 reset_control_assert(csis->mrst);
807 reset_control_deassert(csis->mrst);
810 static int mipi_csis_phy_init(struct mipi_csis_device *csis)
812 if (csis->info->version != MIPI_CSIS_V3_3)
816 csis->mrst = devm_reset_control_get_exclusive(csis->dev, NULL);
817 if (IS_ERR(csis->mrst))
818 return PTR_ERR(csis->mrst);
820 csis->mipi_phy_regulator = devm_regulator_get(csis->dev, "phy");
821 if (IS_ERR(csis->mipi_phy_regulator))
822 return PTR_ERR(csis->mipi_phy_regulator);
824 return regulator_set_voltage(csis->mipi_phy_regulator, 1000000,
832 static void mipi_csis_clear_counters(struct mipi_csis_device *csis)
837 spin_lock_irqsave(&csis->slock, flags);
839 csis->events[i].counter = 0;
840 spin_unlock_irqrestore(&csis->slock, flags);
843 static void mipi_csis_log_counters(struct mipi_csis_device *csis, bool non_errors)
851 spin_lock_irqsave(&csis->slock, flags);
853 counters[i] = csis->events[i].counter;
854 spin_unlock_irqrestore(&csis->slock, flags);
857 if (counters[i] > 0 || csis->debug.enable)
858 dev_info(csis->dev, "%s events: %d\n",
859 csis->events[i].name,
864 static int mipi_csis_dump_regs(struct mipi_csis_device *csis)
888 if (!pm_runtime_get_if_in_use(csis->dev))
891 dev_info(csis->dev, "--- REGISTERS ---\n");
894 cfg = mipi_csis_read(csis, registers[i].offset);
895 dev_info(csis->dev, "%14s: 0x%08x\n", registers[i].name, cfg);
898 pm_runtime_put(csis->dev);
905 struct mipi_csis_device *csis = m->private;
907 return mipi_csis_dump_regs(csis);
911 static void mipi_csis_debugfs_init(struct mipi_csis_device *csis)
913 csis->debug.hs_settle = UINT_MAX;
914 csis->debug.clk_settle = UINT_MAX;
916 csis->debugfs_root = debugfs_create_dir(dev_name(csis->dev), NULL);
918 debugfs_create_bool("debug_enable", 0600, csis->debugfs_root,
919 &csis->debug.enable);
920 debugfs_create_file("dump_regs", 0600, csis->debugfs_root, csis,
922 debugfs_create_u32("tclk_settle", 0600, csis->debugfs_root,
923 &csis->debug.clk_settle);
924 debugfs_create_u32("ths_settle", 0600, csis->debugfs_root,
925 &csis->debug.hs_settle);
928 static void mipi_csis_debugfs_exit(struct mipi_csis_device *csis)
930 debugfs_remove_recursive(csis->debugfs_root);
944 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
951 v4l2_subdev_disable_streams(csis->source.sd,
952 csis->source.pad->index, BIT(0));
954 mipi_csis_stop_stream(csis);
955 if (csis->debug.enable)
956 mipi_csis_log_counters(csis, true);
958 pm_runtime_put(csis->dev);
968 ret = mipi_csis_calculate_params(csis, csis_fmt);
972 mipi_csis_clear_counters(csis);
974 ret = pm_runtime_resume_and_get(csis->dev);
978 mipi_csis_start_stream(csis, format, csis_fmt);
980 ret = v4l2_subdev_enable_streams(csis->source.sd,
981 csis->source.pad->index, BIT(0));
985 mipi_csis_log_counters(csis, true);
992 mipi_csis_stop_stream(csis);
993 pm_runtime_put(csis->dev);
1157 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1159 mipi_csis_log_counters(csis, true);
1160 if (csis->debug.enable)
1161 mipi_csis_dump_regs(csis);
1215 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1218 dev_dbg(csis->dev, "link setup %s -> %s", remote_pad->entity->name,
1228 if (csis->source.sd)
1231 csis->source.sd = remote_sd;
1232 csis->source.pad = remote_pad;
1234 csis->source.sd = NULL;
1235 csis->source.pad = NULL;
1261 struct mipi_csis_device *csis = mipi_notifier_to_csis_state(notifier);
1262 struct media_pad *sink = &csis->sd.entity.pads[CSIS_PAD_SINK];
1271 static int mipi_csis_async_register(struct mipi_csis_device *csis)
1281 v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
1283 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
1294 dev_err(csis->dev,
1301 csis->bus = vep.bus.mipi_csi2;
1303 dev_dbg(csis->dev, "data lanes: %d\n", csis->bus.num_data_lanes);
1304 dev_dbg(csis->dev, "flags: 0x%08x\n", csis->bus.flags);
1306 asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
1315 csis->notifier.ops = &mipi_csis_notify_ops;
1317 ret = v4l2_async_nf_register(&csis->notifier);
1321 return v4l2_async_register_subdev(&csis->sd);
1336 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1339 ret = mipi_csis_phy_disable(csis);
1343 mipi_csis_clk_disable(csis);
1351 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1354 ret = mipi_csis_phy_enable(csis);
1358 ret = mipi_csis_clk_enable(csis);
1360 mipi_csis_phy_disable(csis);
1376 static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
1378 struct v4l2_subdev *sd = &csis->sd;
1384 snprintf(sd->name, sizeof(sd->name), "csis-%s",
1385 dev_name(csis->dev));
1393 sd->dev = csis->dev;
1395 csis->pads[CSIS_PAD_SINK].flags = MEDIA_PAD_FL_SINK
1397 csis->pads[CSIS_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE
1399 ret = media_entity_pads_init(&sd->entity, CSIS_PADS_NUM, csis->pads);
1412 static int mipi_csis_parse_dt(struct mipi_csis_device *csis)
1414 struct device_node *node = csis->dev->of_node;
1417 &csis->clk_frequency))
1418 csis->clk_frequency = DEFAULT_SCLK_CSIS_FREQ;
1426 struct mipi_csis_device *csis;
1430 csis = devm_kzalloc(dev, sizeof(*csis), GFP_KERNEL);
1431 if (!csis)
1434 spin_lock_init(&csis->slock);
1436 csis->dev = dev;
1437 csis->info = of_device_get_match_data(dev);
1439 memcpy(csis->events, mipi_csis_events, sizeof(csis->events));
1442 ret = mipi_csis_parse_dt(csis);
1449 csis->regs = devm_platform_ioremap_resource(pdev, 0);
1450 if (IS_ERR(csis->regs))
1451 return PTR_ERR(csis->regs);
1457 ret = mipi_csis_phy_init(csis);
1461 ret = mipi_csis_clk_get(csis);
1466 mipi_csis_phy_reset(csis);
1470 dev_name(dev), csis);
1477 ret = mipi_csis_subdev_init(csis);
1481 platform_set_drvdata(pdev, &csis->sd);
1483 ret = mipi_csis_async_register(csis);
1490 mipi_csis_debugfs_init(csis);
1501 csis->bus.num_data_lanes, csis->clk_frequency);
1506 mipi_csis_debugfs_exit(csis);
1508 v4l2_subdev_cleanup(&csis->sd);
1509 media_entity_cleanup(&csis->sd.entity);
1510 v4l2_async_nf_unregister(&csis->notifier);
1511 v4l2_async_nf_cleanup(&csis->notifier);
1512 v4l2_async_unregister_subdev(&csis->sd);
1520 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
1522 mipi_csis_debugfs_exit(csis);
1523 v4l2_async_nf_unregister(&csis->notifier);
1524 v4l2_async_nf_cleanup(&csis->notifier);
1525 v4l2_async_unregister_subdev(&csis->sd);
1531 v4l2_subdev_cleanup(&csis->sd);
1532 media_entity_cleanup(&csis->sd.entity);