Lines Matching refs:csis

512 static inline u32 mipi_csis_read(struct mipi_csis_device *csis, u32 reg)  in mipi_csis_read()  argument
514 return readl(csis->regs + reg); in mipi_csis_read()
517 static inline void mipi_csis_write(struct mipi_csis_device *csis, u32 reg, in mipi_csis_write() argument
520 writel(val, csis->regs + reg); in mipi_csis_write()
523 static void mipi_csis_enable_interrupts(struct mipi_csis_device *csis, bool on) in mipi_csis_enable_interrupts() argument
525 mipi_csis_write(csis, MIPI_CSIS_INT_MSK, on ? 0xffffffff : 0); in mipi_csis_enable_interrupts()
526 mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_MSK, on ? 0xffffffff : 0); in mipi_csis_enable_interrupts()
529 static void mipi_csis_sw_reset(struct mipi_csis_device *csis) in mipi_csis_sw_reset() argument
531 u32 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL); in mipi_csis_sw_reset()
533 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, in mipi_csis_sw_reset()
538 static void mipi_csis_system_enable(struct mipi_csis_device *csis, int on) in mipi_csis_system_enable() argument
542 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL); in mipi_csis_system_enable()
547 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, val); in mipi_csis_system_enable()
549 val = mipi_csis_read(csis, MIPI_CSIS_DPHY_CMN_CTRL); in mipi_csis_system_enable()
552 mask = (1 << (csis->bus.num_data_lanes + 1)) - 1; in mipi_csis_system_enable()
555 mipi_csis_write(csis, MIPI_CSIS_DPHY_CMN_CTRL, val); in mipi_csis_system_enable()
558 static void __mipi_csis_set_format(struct mipi_csis_device *csis, in __mipi_csis_set_format() argument
565 val = mipi_csis_read(csis, MIPI_CSIS_ISP_CONFIG_CH(0)); in __mipi_csis_set_format()
586 mipi_csis_write(csis, MIPI_CSIS_ISP_CONFIG_CH(0), val); in __mipi_csis_set_format()
590 mipi_csis_write(csis, MIPI_CSIS_ISP_RESOL_CH(0), val); in __mipi_csis_set_format()
593 static int mipi_csis_calculate_params(struct mipi_csis_device *csis, in mipi_csis_calculate_params() argument
600 link_freq = v4l2_get_link_freq(csis->src_sd->ctrl_handler, in mipi_csis_calculate_params()
602 csis->bus.num_data_lanes * 2); in mipi_csis_calculate_params()
604 dev_err(csis->dev, "Unable to obtain link frequency: %d\n", in mipi_csis_calculate_params()
612 dev_dbg(csis->dev, "Out-of-bound lane rate %u\n", lane_rate); in mipi_csis_calculate_params()
622 csis->hs_settle = (lane_rate - 5000000) / 45000000; in mipi_csis_calculate_params()
623 csis->clk_settle = 0; in mipi_csis_calculate_params()
625 dev_dbg(csis->dev, "lane rate %u, Tclk_settle %u, Ths_settle %u\n", in mipi_csis_calculate_params()
626 lane_rate, csis->clk_settle, csis->hs_settle); in mipi_csis_calculate_params()
628 if (csis->debug.hs_settle < 0xff) { in mipi_csis_calculate_params()
629 dev_dbg(csis->dev, "overriding Ths_settle with %u\n", in mipi_csis_calculate_params()
630 csis->debug.hs_settle); in mipi_csis_calculate_params()
631 csis->hs_settle = csis->debug.hs_settle; in mipi_csis_calculate_params()
634 if (csis->debug.clk_settle < 4) { in mipi_csis_calculate_params()
635 dev_dbg(csis->dev, "overriding Tclk_settle with %u\n", in mipi_csis_calculate_params()
636 csis->debug.clk_settle); in mipi_csis_calculate_params()
637 csis->clk_settle = csis->debug.clk_settle; in mipi_csis_calculate_params()
643 static void mipi_csis_set_params(struct mipi_csis_device *csis, in mipi_csis_set_params() argument
647 int lanes = csis->bus.num_data_lanes; in mipi_csis_set_params()
650 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL); in mipi_csis_set_params()
653 if (csis->info->version == MIPI_CSIS_V3_3) in mipi_csis_set_params()
655 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, val); in mipi_csis_set_params()
657 __mipi_csis_set_format(csis, format, csis_fmt); in mipi_csis_set_params()
659 mipi_csis_write(csis, MIPI_CSIS_DPHY_CMN_CTRL, in mipi_csis_set_params()
660 MIPI_CSIS_DPHY_CMN_CTRL_HSSETTLE(csis->hs_settle) | in mipi_csis_set_params()
661 MIPI_CSIS_DPHY_CMN_CTRL_CLKSETTLE(csis->clk_settle)); in mipi_csis_set_params()
666 mipi_csis_write(csis, MIPI_CSIS_ISP_SYNC_CH(0), val); in mipi_csis_set_params()
668 val = mipi_csis_read(csis, MIPI_CSIS_CLK_CTRL); in mipi_csis_set_params()
672 mipi_csis_write(csis, MIPI_CSIS_CLK_CTRL, val); in mipi_csis_set_params()
674 mipi_csis_write(csis, MIPI_CSIS_DPHY_BCTRL_L, in mipi_csis_set_params()
682 mipi_csis_write(csis, MIPI_CSIS_DPHY_BCTRL_H, 0); in mipi_csis_set_params()
685 val = mipi_csis_read(csis, MIPI_CSIS_CMN_CTRL); in mipi_csis_set_params()
686 mipi_csis_write(csis, MIPI_CSIS_CMN_CTRL, in mipi_csis_set_params()
691 static int mipi_csis_clk_enable(struct mipi_csis_device *csis) in mipi_csis_clk_enable() argument
693 return clk_bulk_prepare_enable(csis->info->num_clocks, csis->clks); in mipi_csis_clk_enable()
696 static void mipi_csis_clk_disable(struct mipi_csis_device *csis) in mipi_csis_clk_disable() argument
698 clk_bulk_disable_unprepare(csis->info->num_clocks, csis->clks); in mipi_csis_clk_disable()
701 static int mipi_csis_clk_get(struct mipi_csis_device *csis) in mipi_csis_clk_get() argument
706 csis->clks = devm_kcalloc(csis->dev, csis->info->num_clocks, in mipi_csis_clk_get()
707 sizeof(*csis->clks), GFP_KERNEL); in mipi_csis_clk_get()
709 if (!csis->clks) in mipi_csis_clk_get()
712 for (i = 0; i < csis->info->num_clocks; i++) in mipi_csis_clk_get()
713 csis->clks[i].id = mipi_csis_clk_id[i]; in mipi_csis_clk_get()
715 ret = devm_clk_bulk_get(csis->dev, csis->info->num_clocks, in mipi_csis_clk_get()
716 csis->clks); in mipi_csis_clk_get()
721 ret = clk_set_rate(csis->clks[MIPI_CSIS_CLK_WRAP].clk, in mipi_csis_clk_get()
722 csis->clk_frequency); in mipi_csis_clk_get()
724 dev_err(csis->dev, "set rate=%d failed: %d\n", in mipi_csis_clk_get()
725 csis->clk_frequency, ret); in mipi_csis_clk_get()
730 static void mipi_csis_start_stream(struct mipi_csis_device *csis, in mipi_csis_start_stream() argument
734 mipi_csis_sw_reset(csis); in mipi_csis_start_stream()
735 mipi_csis_set_params(csis, format, csis_fmt); in mipi_csis_start_stream()
736 mipi_csis_system_enable(csis, true); in mipi_csis_start_stream()
737 mipi_csis_enable_interrupts(csis, true); in mipi_csis_start_stream()
740 static void mipi_csis_stop_stream(struct mipi_csis_device *csis) in mipi_csis_stop_stream() argument
742 mipi_csis_enable_interrupts(csis, false); in mipi_csis_stop_stream()
743 mipi_csis_system_enable(csis, false); in mipi_csis_stop_stream()
748 struct mipi_csis_device *csis = dev_id; in mipi_csis_irq_handler() local
754 status = mipi_csis_read(csis, MIPI_CSIS_INT_SRC); in mipi_csis_irq_handler()
755 dbg_status = mipi_csis_read(csis, MIPI_CSIS_DBG_INTR_SRC); in mipi_csis_irq_handler()
757 spin_lock_irqsave(&csis->slock, flags); in mipi_csis_irq_handler()
760 if ((status & MIPI_CSIS_INT_SRC_ERRORS) || csis->debug.enable) { in mipi_csis_irq_handler()
762 struct mipi_csis_event *event = &csis->events[i]; in mipi_csis_irq_handler()
769 spin_unlock_irqrestore(&csis->slock, flags); in mipi_csis_irq_handler()
771 mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status); in mipi_csis_irq_handler()
772 mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_SRC, dbg_status); in mipi_csis_irq_handler()
781 static int mipi_csis_phy_enable(struct mipi_csis_device *csis) in mipi_csis_phy_enable() argument
783 if (csis->info->version != MIPI_CSIS_V3_3) in mipi_csis_phy_enable()
786 return regulator_enable(csis->mipi_phy_regulator); in mipi_csis_phy_enable()
789 static int mipi_csis_phy_disable(struct mipi_csis_device *csis) in mipi_csis_phy_disable() argument
791 if (csis->info->version != MIPI_CSIS_V3_3) in mipi_csis_phy_disable()
794 return regulator_disable(csis->mipi_phy_regulator); in mipi_csis_phy_disable()
797 static void mipi_csis_phy_reset(struct mipi_csis_device *csis) in mipi_csis_phy_reset() argument
799 if (csis->info->version != MIPI_CSIS_V3_3) in mipi_csis_phy_reset()
802 reset_control_assert(csis->mrst); in mipi_csis_phy_reset()
804 reset_control_deassert(csis->mrst); in mipi_csis_phy_reset()
807 static int mipi_csis_phy_init(struct mipi_csis_device *csis) in mipi_csis_phy_init() argument
809 if (csis->info->version != MIPI_CSIS_V3_3) in mipi_csis_phy_init()
813 csis->mrst = devm_reset_control_get_exclusive(csis->dev, NULL); in mipi_csis_phy_init()
814 if (IS_ERR(csis->mrst)) in mipi_csis_phy_init()
815 return PTR_ERR(csis->mrst); in mipi_csis_phy_init()
817 csis->mipi_phy_regulator = devm_regulator_get(csis->dev, "phy"); in mipi_csis_phy_init()
818 if (IS_ERR(csis->mipi_phy_regulator)) in mipi_csis_phy_init()
819 return PTR_ERR(csis->mipi_phy_regulator); in mipi_csis_phy_init()
821 return regulator_set_voltage(csis->mipi_phy_regulator, 1000000, in mipi_csis_phy_init()
829 static void mipi_csis_clear_counters(struct mipi_csis_device *csis) in mipi_csis_clear_counters() argument
834 spin_lock_irqsave(&csis->slock, flags); in mipi_csis_clear_counters()
836 csis->events[i].counter = 0; in mipi_csis_clear_counters()
837 spin_unlock_irqrestore(&csis->slock, flags); in mipi_csis_clear_counters()
840 static void mipi_csis_log_counters(struct mipi_csis_device *csis, bool non_errors) in mipi_csis_log_counters() argument
847 spin_lock_irqsave(&csis->slock, flags); in mipi_csis_log_counters()
850 if (csis->events[i].counter > 0 || csis->debug.enable) in mipi_csis_log_counters()
851 dev_info(csis->dev, "%s events: %d\n", in mipi_csis_log_counters()
852 csis->events[i].name, in mipi_csis_log_counters()
853 csis->events[i].counter); in mipi_csis_log_counters()
855 spin_unlock_irqrestore(&csis->slock, flags); in mipi_csis_log_counters()
858 static int mipi_csis_dump_regs(struct mipi_csis_device *csis) in mipi_csis_dump_regs() argument
882 if (!pm_runtime_get_if_in_use(csis->dev)) in mipi_csis_dump_regs()
885 dev_info(csis->dev, "--- REGISTERS ---\n"); in mipi_csis_dump_regs()
888 cfg = mipi_csis_read(csis, registers[i].offset); in mipi_csis_dump_regs()
889 dev_info(csis->dev, "%14s: 0x%08x\n", registers[i].name, cfg); in mipi_csis_dump_regs()
892 pm_runtime_put(csis->dev); in mipi_csis_dump_regs()
899 struct mipi_csis_device *csis = m->private; in mipi_csis_dump_regs_show() local
901 return mipi_csis_dump_regs(csis); in mipi_csis_dump_regs_show()
905 static void mipi_csis_debugfs_init(struct mipi_csis_device *csis) in mipi_csis_debugfs_init() argument
907 csis->debug.hs_settle = UINT_MAX; in mipi_csis_debugfs_init()
908 csis->debug.clk_settle = UINT_MAX; in mipi_csis_debugfs_init()
910 csis->debugfs_root = debugfs_create_dir(dev_name(csis->dev), NULL); in mipi_csis_debugfs_init()
912 debugfs_create_bool("debug_enable", 0600, csis->debugfs_root, in mipi_csis_debugfs_init()
913 &csis->debug.enable); in mipi_csis_debugfs_init()
914 debugfs_create_file("dump_regs", 0600, csis->debugfs_root, csis, in mipi_csis_debugfs_init()
916 debugfs_create_u32("tclk_settle", 0600, csis->debugfs_root, in mipi_csis_debugfs_init()
917 &csis->debug.clk_settle); in mipi_csis_debugfs_init()
918 debugfs_create_u32("ths_settle", 0600, csis->debugfs_root, in mipi_csis_debugfs_init()
919 &csis->debug.hs_settle); in mipi_csis_debugfs_init()
922 static void mipi_csis_debugfs_exit(struct mipi_csis_device *csis) in mipi_csis_debugfs_exit() argument
924 debugfs_remove_recursive(csis->debugfs_root); in mipi_csis_debugfs_exit()
938 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd); in mipi_csis_s_stream() local
945 v4l2_subdev_call(csis->src_sd, video, s_stream, 0); in mipi_csis_s_stream()
947 mipi_csis_stop_stream(csis); in mipi_csis_s_stream()
948 if (csis->debug.enable) in mipi_csis_s_stream()
949 mipi_csis_log_counters(csis, true); in mipi_csis_s_stream()
951 pm_runtime_put(csis->dev); in mipi_csis_s_stream()
961 ret = mipi_csis_calculate_params(csis, csis_fmt); in mipi_csis_s_stream()
965 mipi_csis_clear_counters(csis); in mipi_csis_s_stream()
967 ret = pm_runtime_resume_and_get(csis->dev); in mipi_csis_s_stream()
971 mipi_csis_start_stream(csis, format, csis_fmt); in mipi_csis_s_stream()
973 ret = v4l2_subdev_call(csis->src_sd, video, s_stream, 1); in mipi_csis_s_stream()
977 mipi_csis_log_counters(csis, true); in mipi_csis_s_stream()
984 mipi_csis_stop_stream(csis); in mipi_csis_s_stream()
985 pm_runtime_put(csis->dev); in mipi_csis_s_stream()
1151 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd); in mipi_csis_log_status() local
1153 mipi_csis_log_counters(csis, true); in mipi_csis_log_status()
1154 if (csis->debug.enable) in mipi_csis_log_status()
1155 mipi_csis_dump_regs(csis); in mipi_csis_log_status()
1191 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd); in mipi_csis_link_setup() local
1194 dev_dbg(csis->dev, "link setup %s -> %s", remote_pad->entity->name, in mipi_csis_link_setup()
1204 if (csis->src_sd) in mipi_csis_link_setup()
1207 csis->src_sd = remote_sd; in mipi_csis_link_setup()
1209 csis->src_sd = NULL; in mipi_csis_link_setup()
1235 struct mipi_csis_device *csis = mipi_notifier_to_csis_state(notifier); in mipi_csis_notify_bound() local
1236 struct media_pad *sink = &csis->sd.entity.pads[CSIS_PAD_SINK]; in mipi_csis_notify_bound()
1245 static int mipi_csis_async_register(struct mipi_csis_device *csis) in mipi_csis_async_register() argument
1255 v4l2_async_nf_init(&csis->notifier); in mipi_csis_async_register()
1257 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0, in mipi_csis_async_register()
1268 dev_err(csis->dev, in mipi_csis_async_register()
1275 csis->bus = vep.bus.mipi_csi2; in mipi_csis_async_register()
1277 dev_dbg(csis->dev, "data lanes: %d\n", csis->bus.num_data_lanes); in mipi_csis_async_register()
1278 dev_dbg(csis->dev, "flags: 0x%08x\n", csis->bus.flags); in mipi_csis_async_register()
1280 asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep, in mipi_csis_async_register()
1289 csis->notifier.ops = &mipi_csis_notify_ops; in mipi_csis_async_register()
1291 ret = v4l2_async_subdev_nf_register(&csis->sd, &csis->notifier); in mipi_csis_async_register()
1295 return v4l2_async_register_subdev(&csis->sd); in mipi_csis_async_register()
1310 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd); in mipi_csis_runtime_suspend() local
1313 ret = mipi_csis_phy_disable(csis); in mipi_csis_runtime_suspend()
1317 mipi_csis_clk_disable(csis); in mipi_csis_runtime_suspend()
1325 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd); in mipi_csis_runtime_resume() local
1328 ret = mipi_csis_phy_enable(csis); in mipi_csis_runtime_resume()
1332 ret = mipi_csis_clk_enable(csis); in mipi_csis_runtime_resume()
1334 mipi_csis_phy_disable(csis); in mipi_csis_runtime_resume()
1350 static int mipi_csis_subdev_init(struct mipi_csis_device *csis) in mipi_csis_subdev_init() argument
1352 struct v4l2_subdev *sd = &csis->sd; in mipi_csis_subdev_init()
1358 dev_name(csis->dev)); in mipi_csis_subdev_init()
1366 sd->dev = csis->dev; in mipi_csis_subdev_init()
1368 sd->fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), in mipi_csis_subdev_init()
1371 dev_err(csis->dev, "Unable to retrieve endpoint for port@1\n"); in mipi_csis_subdev_init()
1375 csis->pads[CSIS_PAD_SINK].flags = MEDIA_PAD_FL_SINK in mipi_csis_subdev_init()
1377 csis->pads[CSIS_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE in mipi_csis_subdev_init()
1379 ret = media_entity_pads_init(&sd->entity, CSIS_PADS_NUM, csis->pads); in mipi_csis_subdev_init()
1392 static int mipi_csis_parse_dt(struct mipi_csis_device *csis) in mipi_csis_parse_dt() argument
1394 struct device_node *node = csis->dev->of_node; in mipi_csis_parse_dt()
1397 &csis->clk_frequency)) in mipi_csis_parse_dt()
1398 csis->clk_frequency = DEFAULT_SCLK_CSIS_FREQ; in mipi_csis_parse_dt()
1406 struct mipi_csis_device *csis; in mipi_csis_probe() local
1410 csis = devm_kzalloc(dev, sizeof(*csis), GFP_KERNEL); in mipi_csis_probe()
1411 if (!csis) in mipi_csis_probe()
1414 spin_lock_init(&csis->slock); in mipi_csis_probe()
1416 csis->dev = dev; in mipi_csis_probe()
1417 csis->info = of_device_get_match_data(dev); in mipi_csis_probe()
1419 memcpy(csis->events, mipi_csis_events, sizeof(csis->events)); in mipi_csis_probe()
1422 ret = mipi_csis_parse_dt(csis); in mipi_csis_probe()
1429 csis->regs = devm_platform_ioremap_resource(pdev, 0); in mipi_csis_probe()
1430 if (IS_ERR(csis->regs)) in mipi_csis_probe()
1431 return PTR_ERR(csis->regs); in mipi_csis_probe()
1437 ret = mipi_csis_phy_init(csis); in mipi_csis_probe()
1441 ret = mipi_csis_clk_get(csis); in mipi_csis_probe()
1446 mipi_csis_phy_reset(csis); in mipi_csis_probe()
1448 ret = mipi_csis_clk_enable(csis); in mipi_csis_probe()
1450 dev_err(csis->dev, "failed to enable clocks: %d\n", ret); in mipi_csis_probe()
1456 dev_name(dev), csis); in mipi_csis_probe()
1463 ret = mipi_csis_subdev_init(csis); in mipi_csis_probe()
1467 platform_set_drvdata(pdev, &csis->sd); in mipi_csis_probe()
1469 ret = mipi_csis_async_register(csis); in mipi_csis_probe()
1476 mipi_csis_debugfs_init(csis); in mipi_csis_probe()
1487 csis->bus.num_data_lanes, csis->clk_frequency); in mipi_csis_probe()
1492 mipi_csis_debugfs_exit(csis); in mipi_csis_probe()
1494 v4l2_subdev_cleanup(&csis->sd); in mipi_csis_probe()
1495 media_entity_cleanup(&csis->sd.entity); in mipi_csis_probe()
1496 v4l2_async_nf_unregister(&csis->notifier); in mipi_csis_probe()
1497 v4l2_async_nf_cleanup(&csis->notifier); in mipi_csis_probe()
1498 v4l2_async_unregister_subdev(&csis->sd); in mipi_csis_probe()
1500 mipi_csis_clk_disable(csis); in mipi_csis_probe()
1501 fwnode_handle_put(csis->sd.fwnode); in mipi_csis_probe()
1509 struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd); in mipi_csis_remove() local
1511 mipi_csis_debugfs_exit(csis); in mipi_csis_remove()
1512 v4l2_async_nf_unregister(&csis->notifier); in mipi_csis_remove()
1513 v4l2_async_nf_cleanup(&csis->notifier); in mipi_csis_remove()
1514 v4l2_async_unregister_subdev(&csis->sd); in mipi_csis_remove()
1518 mipi_csis_clk_disable(csis); in mipi_csis_remove()
1519 v4l2_subdev_cleanup(&csis->sd); in mipi_csis_remove()
1520 media_entity_cleanup(&csis->sd.entity); in mipi_csis_remove()
1521 fwnode_handle_put(csis->sd.fwnode); in mipi_csis_remove()