Lines Matching refs:vimc

174 static void vimc_rm_links(struct vimc_device *vimc)  in vimc_rm_links()  argument
178 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) in vimc_rm_links()
179 media_entity_remove_links(vimc->ent_devs[i]->ent); in vimc_rm_links()
182 static int vimc_create_links(struct vimc_device *vimc) in vimc_create_links() argument
188 for (i = 0; i < vimc->pipe_cfg->num_data_links; i++) { in vimc_create_links()
189 const struct vimc_data_link *link = &vimc->pipe_cfg->data_links[i]; in vimc_create_links()
192 vimc->ent_devs[link->src_ent]; in vimc_create_links()
194 vimc->ent_devs[link->sink_ent]; in vimc_create_links()
203 for (i = 0; i < vimc->pipe_cfg->num_ancillary_links; i++) { in vimc_create_links()
204 const struct vimc_ancillary_link *link = &vimc->pipe_cfg->ancillary_links[i]; in vimc_create_links()
207 vimc->ent_devs[link->primary_ent]; in vimc_create_links()
209 vimc->ent_devs[link->ancillary_ent]; in vimc_create_links()
222 vimc_rm_links(vimc); in vimc_create_links()
226 static void vimc_release_subdevs(struct vimc_device *vimc) in vimc_release_subdevs() argument
230 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) in vimc_release_subdevs()
231 if (vimc->ent_devs[i]) in vimc_release_subdevs()
232 vimc->pipe_cfg->ents[i].type->release(vimc->ent_devs[i]); in vimc_release_subdevs()
235 static void vimc_unregister_subdevs(struct vimc_device *vimc) in vimc_unregister_subdevs() argument
239 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) in vimc_unregister_subdevs()
240 if (vimc->ent_devs[i] && vimc->pipe_cfg->ents[i].type->unregister) in vimc_unregister_subdevs()
241 vimc->pipe_cfg->ents[i].type->unregister(vimc->ent_devs[i]); in vimc_unregister_subdevs()
244 static int vimc_add_subdevs(struct vimc_device *vimc) in vimc_add_subdevs() argument
248 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) { in vimc_add_subdevs()
249 dev_dbg(vimc->mdev.dev, "new entity for %s\n", in vimc_add_subdevs()
250 vimc->pipe_cfg->ents[i].name); in vimc_add_subdevs()
251 vimc->ent_devs[i] = vimc->pipe_cfg->ents[i].type->add(vimc, in vimc_add_subdevs()
252 vimc->pipe_cfg->ents[i].name); in vimc_add_subdevs()
253 if (IS_ERR(vimc->ent_devs[i])) { in vimc_add_subdevs()
254 int err = PTR_ERR(vimc->ent_devs[i]); in vimc_add_subdevs()
256 dev_err(vimc->mdev.dev, "adding entity %s failed (%d)\n", in vimc_add_subdevs()
257 vimc->pipe_cfg->ents[i].name, err); in vimc_add_subdevs()
258 vimc->ent_devs[i] = NULL; in vimc_add_subdevs()
259 vimc_unregister_subdevs(vimc); in vimc_add_subdevs()
260 vimc_release_subdevs(vimc); in vimc_add_subdevs()
269 struct vimc_device *vimc = in vimc_v4l2_dev_release() local
272 vimc_release_subdevs(vimc); in vimc_v4l2_dev_release()
273 media_device_cleanup(&vimc->mdev); in vimc_v4l2_dev_release()
274 kfree(vimc->ent_devs); in vimc_v4l2_dev_release()
275 kfree(vimc); in vimc_v4l2_dev_release()
278 static int vimc_register_devices(struct vimc_device *vimc) in vimc_register_devices() argument
283 ret = v4l2_device_register(vimc->mdev.dev, &vimc->v4l2_dev); in vimc_register_devices()
285 dev_err(vimc->mdev.dev, in vimc_register_devices()
290 vimc->ent_devs = kcalloc(vimc->pipe_cfg->num_ents, in vimc_register_devices()
291 sizeof(*vimc->ent_devs), GFP_KERNEL); in vimc_register_devices()
292 if (!vimc->ent_devs) { in vimc_register_devices()
298 ret = vimc_add_subdevs(vimc); in vimc_register_devices()
303 ret = vimc_create_links(vimc); in vimc_register_devices()
308 ret = media_device_register(&vimc->mdev); in vimc_register_devices()
310 dev_err(vimc->mdev.dev, in vimc_register_devices()
316 ret = v4l2_device_register_subdev_nodes(&vimc->v4l2_dev); in vimc_register_devices()
318 dev_err(vimc->mdev.dev, in vimc_register_devices()
327 media_device_unregister(&vimc->mdev); in vimc_register_devices()
329 vimc_unregister_subdevs(vimc); in vimc_register_devices()
330 vimc_release_subdevs(vimc); in vimc_register_devices()
332 kfree(vimc->ent_devs); in vimc_register_devices()
334 v4l2_device_unregister(&vimc->v4l2_dev); in vimc_register_devices()
342 struct vimc_device *vimc; in vimc_probe() local
357 vimc = kzalloc(sizeof(*vimc), GFP_KERNEL); in vimc_probe()
358 if (!vimc) in vimc_probe()
361 vimc->pipe_cfg = &pipe_cfg; in vimc_probe()
364 vimc->v4l2_dev.mdev = &vimc->mdev; in vimc_probe()
367 strscpy(vimc->mdev.model, VIMC_MDEV_MODEL_NAME, in vimc_probe()
368 sizeof(vimc->mdev.model)); in vimc_probe()
369 snprintf(vimc->mdev.bus_info, sizeof(vimc->mdev.bus_info), in vimc_probe()
371 vimc->mdev.dev = &pdev->dev; in vimc_probe()
372 media_device_init(&vimc->mdev); in vimc_probe()
374 ret = vimc_register_devices(vimc); in vimc_probe()
376 media_device_cleanup(&vimc->mdev); in vimc_probe()
377 kfree(vimc); in vimc_probe()
385 vimc->v4l2_dev.release = vimc_v4l2_dev_release; in vimc_probe()
386 platform_set_drvdata(pdev, vimc); in vimc_probe()
392 struct vimc_device *vimc = platform_get_drvdata(pdev); in vimc_remove() local
396 vimc_unregister_subdevs(vimc); in vimc_remove()
397 media_device_unregister(&vimc->mdev); in vimc_remove()
398 v4l2_device_unregister(&vimc->v4l2_dev); in vimc_remove()
399 v4l2_device_put(&vimc->v4l2_dev); in vimc_remove()