Lines Matching refs:vimc
117 static void vimc_rm_links(struct vimc_device *vimc) in vimc_rm_links() argument
121 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) in vimc_rm_links()
122 media_entity_remove_links(vimc->ent_devs[i]->ent); in vimc_rm_links()
125 static int vimc_create_links(struct vimc_device *vimc) in vimc_create_links() argument
131 for (i = 0; i < vimc->pipe_cfg->num_links; i++) { in vimc_create_links()
132 const struct vimc_ent_link *link = &vimc->pipe_cfg->links[i]; in vimc_create_links()
135 vimc->ent_devs[link->src_ent]; in vimc_create_links()
137 vimc->ent_devs[link->sink_ent]; in vimc_create_links()
149 vimc_rm_links(vimc); in vimc_create_links()
153 static void vimc_release_subdevs(struct vimc_device *vimc) in vimc_release_subdevs() argument
157 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) in vimc_release_subdevs()
158 if (vimc->ent_devs[i]) in vimc_release_subdevs()
159 vimc->pipe_cfg->ents[i].type->release(vimc->ent_devs[i]); in vimc_release_subdevs()
162 static void vimc_unregister_subdevs(struct vimc_device *vimc) in vimc_unregister_subdevs() argument
166 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) in vimc_unregister_subdevs()
167 if (vimc->ent_devs[i] && vimc->pipe_cfg->ents[i].type->unregister) in vimc_unregister_subdevs()
168 vimc->pipe_cfg->ents[i].type->unregister(vimc->ent_devs[i]); in vimc_unregister_subdevs()
171 static int vimc_add_subdevs(struct vimc_device *vimc) in vimc_add_subdevs() argument
175 for (i = 0; i < vimc->pipe_cfg->num_ents; i++) { in vimc_add_subdevs()
176 dev_dbg(vimc->mdev.dev, "new entity for %s\n", in vimc_add_subdevs()
177 vimc->pipe_cfg->ents[i].name); in vimc_add_subdevs()
178 vimc->ent_devs[i] = vimc->pipe_cfg->ents[i].type->add(vimc, in vimc_add_subdevs()
179 vimc->pipe_cfg->ents[i].name); in vimc_add_subdevs()
180 if (IS_ERR(vimc->ent_devs[i])) { in vimc_add_subdevs()
181 int err = PTR_ERR(vimc->ent_devs[i]); in vimc_add_subdevs()
183 dev_err(vimc->mdev.dev, "adding entity %s failed (%d)\n", in vimc_add_subdevs()
184 vimc->pipe_cfg->ents[i].name, err); in vimc_add_subdevs()
185 vimc->ent_devs[i] = NULL; in vimc_add_subdevs()
186 vimc_unregister_subdevs(vimc); in vimc_add_subdevs()
187 vimc_release_subdevs(vimc); in vimc_add_subdevs()
196 struct vimc_device *vimc = in vimc_v4l2_dev_release() local
199 vimc_release_subdevs(vimc); in vimc_v4l2_dev_release()
200 media_device_cleanup(&vimc->mdev); in vimc_v4l2_dev_release()
201 kfree(vimc->ent_devs); in vimc_v4l2_dev_release()
202 kfree(vimc); in vimc_v4l2_dev_release()
205 static int vimc_register_devices(struct vimc_device *vimc) in vimc_register_devices() argument
210 ret = v4l2_device_register(vimc->mdev.dev, &vimc->v4l2_dev); in vimc_register_devices()
212 dev_err(vimc->mdev.dev, in vimc_register_devices()
217 vimc->ent_devs = kcalloc(vimc->pipe_cfg->num_ents, in vimc_register_devices()
218 sizeof(*vimc->ent_devs), GFP_KERNEL); in vimc_register_devices()
219 if (!vimc->ent_devs) { in vimc_register_devices()
225 ret = vimc_add_subdevs(vimc); in vimc_register_devices()
230 ret = vimc_create_links(vimc); in vimc_register_devices()
235 ret = media_device_register(&vimc->mdev); in vimc_register_devices()
237 dev_err(vimc->mdev.dev, in vimc_register_devices()
243 ret = v4l2_device_register_subdev_nodes(&vimc->v4l2_dev); in vimc_register_devices()
245 dev_err(vimc->mdev.dev, in vimc_register_devices()
254 media_device_unregister(&vimc->mdev); in vimc_register_devices()
256 vimc_unregister_subdevs(vimc); in vimc_register_devices()
257 vimc_release_subdevs(vimc); in vimc_register_devices()
259 kfree(vimc->ent_devs); in vimc_register_devices()
261 v4l2_device_unregister(&vimc->v4l2_dev); in vimc_register_devices()
269 struct vimc_device *vimc; in vimc_probe() local
281 vimc = kzalloc(sizeof(*vimc), GFP_KERNEL); in vimc_probe()
282 if (!vimc) in vimc_probe()
285 vimc->pipe_cfg = &pipe_cfg; in vimc_probe()
288 vimc->v4l2_dev.mdev = &vimc->mdev; in vimc_probe()
291 strscpy(vimc->mdev.model, VIMC_MDEV_MODEL_NAME, in vimc_probe()
292 sizeof(vimc->mdev.model)); in vimc_probe()
293 snprintf(vimc->mdev.bus_info, sizeof(vimc->mdev.bus_info), in vimc_probe()
295 vimc->mdev.dev = &pdev->dev; in vimc_probe()
296 media_device_init(&vimc->mdev); in vimc_probe()
298 ret = vimc_register_devices(vimc); in vimc_probe()
300 media_device_cleanup(&vimc->mdev); in vimc_probe()
301 kfree(vimc); in vimc_probe()
309 vimc->v4l2_dev.release = vimc_v4l2_dev_release; in vimc_probe()
310 platform_set_drvdata(pdev, vimc); in vimc_probe()
316 struct vimc_device *vimc = platform_get_drvdata(pdev); in vimc_remove() local
320 vimc_unregister_subdevs(vimc); in vimc_remove()
321 media_device_unregister(&vimc->mdev); in vimc_remove()
322 v4l2_device_unregister(&vimc->v4l2_dev); in vimc_remove()
323 v4l2_device_put(&vimc->v4l2_dev); in vimc_remove()