Lines Matching defs:vimc
3 * vimc-core.c Virtual Media Controller Driver
17 #include "vimc-common.h"
110 /* TODO: change this to vimc-input when it is implemented */
174 static void vimc_rm_links(struct vimc_device *vimc)
178 for (i = 0; i < vimc->pipe_cfg->num_ents; i++)
179 media_entity_remove_links(vimc->ent_devs[i]->ent);
182 static int vimc_create_links(struct vimc_device *vimc)
188 for (i = 0; i < vimc->pipe_cfg->num_data_links; i++) {
189 const struct vimc_data_link *link = &vimc->pipe_cfg->data_links[i];
192 vimc->ent_devs[link->src_ent];
194 vimc->ent_devs[link->sink_ent];
203 for (i = 0; i < vimc->pipe_cfg->num_ancillary_links; i++) {
204 const struct vimc_ancillary_link *link = &vimc->pipe_cfg->ancillary_links[i];
207 vimc->ent_devs[link->primary_ent];
209 vimc->ent_devs[link->ancillary_ent];
222 vimc_rm_links(vimc);
226 static void vimc_release_subdevs(struct vimc_device *vimc)
230 for (i = 0; i < vimc->pipe_cfg->num_ents; i++)
231 if (vimc->ent_devs[i])
232 vimc->pipe_cfg->ents[i].type->release(vimc->ent_devs[i]);
235 static void vimc_unregister_subdevs(struct vimc_device *vimc)
239 for (i = 0; i < vimc->pipe_cfg->num_ents; i++)
240 if (vimc->ent_devs[i] && vimc->pipe_cfg->ents[i].type->unregister)
241 vimc->pipe_cfg->ents[i].type->unregister(vimc->ent_devs[i]);
244 static int vimc_add_subdevs(struct vimc_device *vimc)
248 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) {
249 dev_dbg(vimc->mdev.dev, "new entity for %s\n",
250 vimc->pipe_cfg->ents[i].name);
251 vimc->ent_devs[i] = vimc->pipe_cfg->ents[i].type->add(vimc,
252 vimc->pipe_cfg->ents[i].name);
253 if (IS_ERR(vimc->ent_devs[i])) {
254 int err = PTR_ERR(vimc->ent_devs[i]);
256 dev_err(vimc->mdev.dev, "adding entity %s failed (%d)\n",
257 vimc->pipe_cfg->ents[i].name, err);
258 vimc->ent_devs[i] = NULL;
259 vimc_unregister_subdevs(vimc);
260 vimc_release_subdevs(vimc);
269 struct vimc_device *vimc =
272 vimc_release_subdevs(vimc);
273 media_device_cleanup(&vimc->mdev);
274 kfree(vimc->ent_devs);
275 kfree(vimc);
278 static int vimc_register_devices(struct vimc_device *vimc)
283 ret = v4l2_device_register(vimc->mdev.dev, &vimc->v4l2_dev);
285 dev_err(vimc->mdev.dev,
290 vimc->ent_devs = kzalloc_objs(*vimc->ent_devs, vimc->pipe_cfg->num_ents);
291 if (!vimc->ent_devs) {
297 ret = vimc_add_subdevs(vimc);
302 ret = vimc_create_links(vimc);
307 ret = media_device_register(&vimc->mdev);
309 dev_err(vimc->mdev.dev,
315 ret = v4l2_device_register_subdev_nodes(&vimc->v4l2_dev);
317 dev_err(vimc->mdev.dev,
318 "vimc subdev nodes registration failed (err=%d)\n",
326 media_device_unregister(&vimc->mdev);
328 vimc_unregister_subdevs(vimc);
329 vimc_release_subdevs(vimc);
331 kfree(vimc->ent_devs);
333 v4l2_device_unregister(&vimc->v4l2_dev);
341 struct vimc_device *vimc;
356 vimc = kzalloc_obj(*vimc);
357 if (!vimc)
360 vimc->pipe_cfg = &pipe_cfg;
363 vimc->v4l2_dev.mdev = &vimc->mdev;
366 strscpy(vimc->mdev.model, VIMC_MDEV_MODEL_NAME,
367 sizeof(vimc->mdev.model));
368 vimc->mdev.dev = &pdev->dev;
369 media_device_init(&vimc->mdev);
371 ret = vimc_register_devices(vimc);
373 media_device_cleanup(&vimc->mdev);
374 kfree(vimc);
382 vimc->v4l2_dev.release = vimc_v4l2_dev_release;
383 platform_set_drvdata(pdev, vimc);
389 struct vimc_device *vimc = platform_get_drvdata(pdev);
393 vimc_unregister_subdevs(vimc);
394 media_device_unregister(&vimc->mdev);
395 v4l2_device_unregister(&vimc->v4l2_dev);
396 v4l2_device_put(&vimc->v4l2_dev);