Lines Matching defs:vi

30 #include "vi.h"
66 static int tegra_get_format_idx_by_code(struct tegra_vi *vi,
72 for (i = offset; i < vi->soc->nformats; ++i) {
73 if (vi->soc->video_formats[i].code == code)
80 static u32 tegra_get_format_fourcc_by_idx(struct tegra_vi *vi,
83 if (index >= vi->soc->nformats)
86 return vi->soc->video_formats[index].fourcc;
90 tegra_get_format_by_fourcc(struct tegra_vi *vi, u32 fourcc)
94 for (i = 0; i < vi->soc->nformats; ++i) {
95 if (vi->soc->video_formats[i].fourcc == fourcc)
96 return &vi->soc->video_formats[i];
119 alloc_devs[0] = chan->vi->dev;
121 if (chan->vi->ops->channel_queue_setup)
122 chan->vi->ops->channel_queue_setup(chan);
265 ret = pm_runtime_resume_and_get(chan->vi->dev);
267 dev_err(chan->vi->dev, "failed to get runtime PM: %d\n", ret);
271 ret = chan->vi->ops->vi_start_streaming(vq, count);
273 pm_runtime_put(chan->vi->dev);
282 chan->vi->ops->vi_stop_streaming(vq);
283 pm_runtime_put(chan->vi->dev);
307 dev_name(chan->vi->dev));
344 fmtinfo = tegra_get_format_by_fourcc(chan->vi, sizes->pixel_format);
376 fmtinfo = tegra_get_format_by_fourcc(chan->vi, ivals->pixel_format);
410 f->pixelformat = tegra_get_format_fourcc_by_idx(chan->vi, index - 1);
461 fmtinfo = tegra_get_format_by_fourcc(chan->vi, pix->pixelformat);
465 fmtinfo = tegra_get_format_by_fourcc(chan->vi,
503 chan->vi->ops->vi_fmt_align(pix, fmtinfo->bpp);
546 fmtinfo = tegra_get_format_by_fourcc(chan->vi, pix->pixelformat);
556 chan->vi->ops->vi_fmt_align(pix, fmtinfo->bpp);
582 index = tegra_get_format_idx_by_code(chan->vi, fmt.format.code, 0);
586 chan->fmtinfo = &chan->vi->soc->video_formats[index];
592 chan->vi->ops->vi_fmt_align(&chan->format, chan->fmtinfo->bpp);
761 chan->vi->ops->vi_fmt_align(&chan->format, chan->fmtinfo->bpp);
963 dev_err(chan->vi->dev, "failed to add TPG ctrl handler: %d\n",
974 dev_err(chan->vi->dev, "failed to add %s ctrl handler: %d\n",
988 dev_err(chan->vi->dev,
995 if (chan->vi->soc->has_h_v_flip) {
1005 dev_err(chan->vi->dev,
1020 index = tegra_get_format_idx_by_code(chan->vi,
1024 index = tegra_get_format_idx_by_code(chan->vi,
1052 index = tegra_get_format_idx_by_code(chan->vi, code.code, 0);
1058 index = tegra_get_format_idx_by_code(chan->vi,
1071 match_code = chan->vi->soc->default_video_format->code;
1072 index = tegra_get_format_idx_by_code(chan->vi, match_code, 0);
1089 chan->vi->ops->channel_host1x_syncpt_free(chan);
1093 void tegra_channels_cleanup(struct tegra_vi *vi)
1097 if (!vi)
1100 list_for_each_entry_safe(chan, tmp, &vi->vi_chans, list) {
1109 struct tegra_vi *vi = chan->vi;
1110 struct tegra_video_device *vid = dev_get_drvdata(vi->client.host);
1122 chan->fmtinfo = chan->vi->soc->default_video_format;
1130 vi->ops->vi_fmt_align(&chan->format, chan->fmtinfo->bpp);
1132 ret = vi->ops->channel_host1x_syncpt_init(chan);
1140 dev_err(vi->dev,
1147 dev_err(vi->dev,
1158 dev_name(vi->dev), "output", chan->portnos[0]);
1178 chan->queue.dev = vi->dev;
1181 dev_err(vi->dev, "failed to initialize vb2 queue: %d\n", ret);
1195 vi->ops->channel_host1x_syncpt_free(chan);
1199 static int tegra_vi_channel_alloc(struct tegra_vi *vi, unsigned int port_num,
1215 chan->vi = vi;
1231 list_add_tail(&chan->list, &vi->vi_chans);
1236 static int tegra_vi_tpg_channels_alloc(struct tegra_vi *vi)
1239 unsigned int nchannels = vi->soc->vi_max_channels;
1243 ret = tegra_vi_channel_alloc(vi, port_num,
1244 vi->dev->of_node, 2);
1252 static int tegra_vi_channels_alloc(struct tegra_vi *vi)
1254 struct device_node *node = vi->dev->of_node;
1266 return dev_err_probe(vi->dev, -ENODEV, "%pOF: missing 'ports' node\n", node);
1276 if (port_num > vi->soc->vi_max_channels) {
1277 dev_err(vi->dev, "invalid port num %d for %pOF\n",
1301 ret = tegra_vi_channel_alloc(vi, port_num, port, lanes);
1312 static int tegra_vi_channels_init(struct tegra_vi *vi)
1317 list_for_each_entry(chan, &vi->vi_chans, list) {
1320 dev_err(vi->dev,
1330 list_for_each_entry_continue_reverse(chan, &vi->vi_chans, list)
1338 struct tegra_vi *vi = vid->vi;
1343 list_for_each_entry(chan, &vi->vi_chans, list)
1352 struct tegra_vi *vi = vid->vi;
1359 if (!vi || !csi)
1365 list_for_each_entry(vi_chan, &vi->vi_chans, list) {
1374 dev_err(vi->dev,
1382 dev_err(vi->dev,
1387 dev_dbg(vi->dev, "creating %s:%u -> %s:%u link\n",
1395 dev_err(vi->dev,
1420 struct tegra_vi *vi = dev_get_drvdata(dev);
1423 ret = regulator_enable(vi->vdd);
1429 ret = clk_set_rate(vi->clk, vi->soc->vi_max_clk_hz);
1431 dev_err(dev, "failed to set vi clock rate: %d\n", ret);
1435 ret = clk_prepare_enable(vi->clk);
1437 dev_err(dev, "failed to enable vi clock: %d\n", ret);
1444 regulator_disable(vi->vdd);
1450 struct tegra_vi *vi = dev_get_drvdata(dev);
1452 clk_disable_unprepare(vi->clk);
1454 regulator_disable(vi->vdd);
1482 struct tegra_vi *vi = chan->vi;
1493 dev_dbg(vi->dev, "creating links for entity %s\n", local->name);
1503 dev_err(vi->dev, "failed to parse link for %pOF: %d\n",
1509 dev_err(vi->dev, "invalid port number %u on %pOF\n",
1517 /* Remote node is vi node. So use channel video entity and pad
1520 if (link.remote_node == of_fwnode_handle(vi->dev->of_node)) {
1531 dev_dbg(vi->dev, "skipping sink port %pOF:%u\n",
1541 dev_err(vi->dev, "no entity found for %pOF\n",
1550 dev_err(vi->dev, "invalid port number %u on %pOF\n",
1561 dev_dbg(vi->dev, "creating %s:%u -> %s:%u link\n",
1570 dev_err(vi->dev,
1588 struct tegra_vi *vi;
1592 vi = chan->vi;
1594 dev_dbg(vi->dev, "notify complete, all subdevs registered\n");
1609 dev_err(vi->dev,
1624 dev_err(vi->dev,
1631 dev_err(vi->dev,
1639 dev_err(vi->dev,
1661 struct tegra_vi *vi;
1665 vi = chan->vi;
1674 dev_err(vi->dev, "no entity for subdev %s\n", subdev->name);
1679 dev_err(vi->dev, "duplicate subdev for node %pOF\n",
1684 dev_dbg(vi->dev, "subdev %s bound\n", subdev->name);
1699 struct tegra_vi *vi = chan->vi;
1706 dev_dbg(vi->dev, "parsing node %pOF\n", to_of_node(fwnode));
1713 dev_err(vi->dev,
1720 if (device_match_fwnode(vi->dev, remote) ||
1731 dev_err(vi->dev,
1749 dev_err(vi->dev, "failed parsing the graph: %d\n", ret);
1755 static int tegra_vi_graph_init(struct tegra_vi *vi)
1758 struct fwnode_handle *fwnode = dev_fwnode(vi->dev);
1770 list_for_each_entry(chan, &vi->vi_chans, list) {
1789 dev_err(vi->dev,
1799 static void tegra_vi_graph_cleanup(struct tegra_vi *vi)
1803 list_for_each_entry(chan, &vi->vi_chans, list) {
1813 struct tegra_vi *vi = host1x_client_to_vi(client);
1817 vid->media_dev.hw_revision = vi->soc->hw_revision;
1819 "platform:%s", dev_name(vi->dev));
1821 INIT_LIST_HEAD(&vi->vi_chans);
1824 ret = tegra_vi_tpg_channels_alloc(vi);
1826 ret = tegra_vi_channels_alloc(vi);
1830 ret = tegra_vi_channels_init(vi);
1834 vid->vi = vi;
1837 ret = tegra_vi_graph_init(vi);
1845 list_for_each_entry(chan, &vi->vi_chans, list)
1848 list_for_each_entry_safe(chan, tmp, &vi->vi_chans, list) {
1858 struct tegra_vi *vi = host1x_client_to_vi(client);
1868 tegra_vi_graph_cleanup(vi);
1880 struct tegra_vi *vi;
1883 vi = devm_kzalloc(&pdev->dev, sizeof(*vi), GFP_KERNEL);
1884 if (!vi)
1887 vi->iomem = devm_platform_ioremap_resource(pdev, 0);
1888 if (IS_ERR(vi->iomem))
1889 return PTR_ERR(vi->iomem);
1891 vi->soc = of_device_get_match_data(&pdev->dev);
1893 vi->clk = devm_clk_get(&pdev->dev, NULL);
1894 if (IS_ERR(vi->clk)) {
1895 ret = PTR_ERR(vi->clk);
1896 dev_err(&pdev->dev, "failed to get vi clock: %d\n", ret);
1900 vi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi");
1901 if (IS_ERR(vi->vdd)) {
1902 ret = PTR_ERR(vi->vdd);
1916 "failed to populate vi child device: %d\n", ret);
1920 vi->dev = &pdev->dev;
1921 vi->ops = vi->soc->ops;
1922 platform_set_drvdata(pdev, vi);
1926 INIT_LIST_HEAD(&vi->client.list);
1927 vi->client.ops = &vi_client_ops;
1928 vi->client.dev = &pdev->dev;
1930 if (vi->ops->vi_enable)
1931 vi->ops->vi_enable(vi, true);
1933 ret = host1x_client_register(&vi->client);
1943 if (vi->ops->vi_enable)
1944 vi->ops->vi_enable(vi, false);
1951 struct tegra_vi *vi = platform_get_drvdata(pdev);
1953 host1x_client_unregister(&vi->client);
1955 if (vi->ops->vi_enable)
1956 vi->ops->vi_enable(vi, false);
1962 { .compatible = "nvidia,tegra20-vi", .data = &tegra20_vi_soc },
1965 { .compatible = "nvidia,tegra210-vi", .data = &tegra210_vi_soc },
1977 .name = "tegra-vi",