dev_dbg(isi->dev, "Bound subdev %s to crossbar input %u\n", sd->name,
masd->port);
/* * Enforce suspend/resume ordering between the source (supplier) and * the ISI (consumer). The source will be suspended before and resume * after the ISI.
*/
link = device_link_add(isi->dev, sd->dev, DL_FLAG_STATELESS); if (!link) {
dev_err(isi->dev, "Failed to create device link to source %s\n", sd->name); return -EINVAL;
}
/* Initialize the media device. */
strscpy(media_dev->model, "FSL Capture Media Device", sizeof(media_dev->model));
media_dev->dev = isi->dev;
media_device_init(media_dev);
/* Initialize and register the V4L2 device. */
v4l2_dev->mdev = media_dev;
strscpy(v4l2_dev->name, "mx8-img-md", sizeof(v4l2_dev->name));
ret = v4l2_device_register(isi->dev, v4l2_dev); if (ret < 0) {
dev_err(isi->dev, "Failed to register V4L2 device: %d\n", ret); goto err_media;
}
/* Register the crossbar switch subdev. */
ret = mxc_isi_crossbar_register(&isi->crossbar); if (ret < 0) {
dev_err(isi->dev, "Failed to register crossbar: %d\n", ret); goto err_v4l2;
}
/* Register the pipeline subdevs and link them to the crossbar switch. */ for (i = 0; i < isi->pdata->num_channels; ++i) { struct mxc_isi_pipe *pipe = &isi->pipes[i];
ret = mxc_isi_pipe_register(pipe); if (ret < 0) {
dev_err(isi->dev, "Failed to register pipe%u: %d\n", i,
ret); goto err_v4l2;
}
ret = media_create_pad_link(&isi->crossbar.sd.entity,
isi->crossbar.num_sinks + i,
&pipe->sd.entity,
MXC_ISI_PIPE_PAD_SINK,
MEDIA_LNK_FL_IMMUTABLE |
MEDIA_LNK_FL_ENABLED); if (ret < 0) goto err_v4l2;
}
/* Register the M2M device. */
ret = mxc_isi_m2m_register(isi, v4l2_dev); if (ret < 0) {
dev_err(isi->dev, "Failed to register M2M device: %d\n", ret); goto err_v4l2;
}
/* Initialize, fill and register the async notifier. */
v4l2_async_nf_init(&isi->notifier, v4l2_dev);
isi->notifier.ops = &mxc_isi_async_notifier_ops;
for (i = 0; i < isi->pdata->num_ports; ++i) { struct mxc_isi_async_subdev *masd; struct fwnode_handle *ep;
ep = fwnode_graph_get_endpoint_by_id(node, i, 0,
FWNODE_GRAPH_ENDPOINT_NEXT);
for (i = 0; i < isi->pdata->num_channels; ++i) { struct mxc_isi_pipe *pipe = &isi->pipes[i];
mxc_isi_video_suspend(pipe);
}
return pm_runtime_force_suspend(dev);
}
staticint mxc_isi_pm_resume(struct device *dev)
{ struct mxc_isi_dev *isi = dev_get_drvdata(dev); unsignedint i; int err = 0; int ret;
ret = pm_runtime_force_resume(dev); if (ret < 0) return ret;
for (i = 0; i < isi->pdata->num_channels; ++i) { struct mxc_isi_pipe *pipe = &isi->pipes[i];
ret = mxc_isi_video_resume(pipe); if (ret) {
dev_err(dev, "Failed to resume pipeline %u (%d)\n", i,
ret); /* * Record the last error as it's as meaningful as any, * and continue resuming the other pipelines.
*/
err = ret;
}
}
isi = devm_kzalloc(dev, sizeof(*isi), GFP_KERNEL); if (!isi) return -ENOMEM;
isi->dev = dev;
platform_set_drvdata(pdev, isi);
isi->pdata = of_device_get_match_data(dev);
isi->pipes = kcalloc(isi->pdata->num_channels, sizeof(isi->pipes[0]),
GFP_KERNEL); if (!isi->pipes) return -ENOMEM;
isi->num_clks = devm_clk_bulk_get_all(dev, &isi->clks); if (isi->num_clks < 0) return dev_err_probe(dev, isi->num_clks, "Failed to get clocks\n");
isi->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(isi->regs)) return dev_err_probe(dev, PTR_ERR(isi->regs), "Failed to get ISI register map\n");
if (isi->pdata->gasket_ops) {
isi->gasket = syscon_regmap_lookup_by_phandle(dev->of_node, "fsl,blk-ctrl"); if (IS_ERR(isi->gasket)) return dev_err_probe(dev, PTR_ERR(isi->gasket), "failed to get gasket\n");
}
ret = mxc_isi_crossbar_init(isi); if (ret) {
dev_err(dev, "Failed to initialize crossbar: %d\n", ret); goto err_pm;
}
for (i = 0; i < isi->pdata->num_channels; ++i) {
ret = mxc_isi_pipe_init(isi, i); if (ret < 0) {
dev_err(dev, "Failed to initialize pipe%u: %d\n", i,
ret); goto err_xbar;
}
}
ret = mxc_isi_v4l2_init(isi); if (ret < 0) {
dev_err(dev, "Failed to initialize V4L2: %d\n", ret); goto err_xbar;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.