Lines Matching refs:group
52 static int rvin_group_entity_to_csi_id(struct rvin_group *group, in rvin_group_entity_to_csi_id() argument
61 if (group->csi[i].subdev == sd) in rvin_group_entity_to_csi_id()
115 struct rvin_group *group = container_of(link->graph_obj.mdev, in rvin_group_link_notify() local
139 media_device_for_each_entity(entity, &group->mdev) in rvin_group_link_notify()
143 mutex_lock(&group->lock); in rvin_group_link_notify()
150 if (WARN_ON(!group->vin[master_id])) { in rvin_group_link_notify()
157 if (!group->vin[i]) in rvin_group_link_notify()
162 &group->vin[i]->vdev.entity.pads[0]); in rvin_group_link_notify()
166 csi_id = rvin_group_entity_to_csi_id(group, csi_pad->entity); in rvin_group_link_notify()
169 mask &= rvin_group_get_mask(group->vin[i], csi_id, channel); in rvin_group_link_notify()
173 csi_id = rvin_group_entity_to_csi_id(group, link->source->entity); in rvin_group_link_notify()
188 if (group->vin[i] && group->vin[i]->parallel && in rvin_group_link_notify()
189 group->vin[i]->parallel->subdev == sd) { in rvin_group_link_notify()
190 group->vin[i]->is_csi = false; in rvin_group_link_notify()
212 ret = rvin_set_channel_routing(group->vin[master_id], __ffs(mask_new)); in rvin_group_link_notify()
219 mutex_unlock(&group->lock); in rvin_group_link_notify()
244 static void rvin_group_cleanup(struct rvin_group *group) in rvin_group_cleanup() argument
246 media_device_cleanup(&group->mdev); in rvin_group_cleanup()
247 mutex_destroy(&group->lock); in rvin_group_cleanup()
250 static int rvin_group_init(struct rvin_group *group, struct rvin_dev *vin) in rvin_group_init() argument
252 struct media_device *mdev = &group->mdev; in rvin_group_init()
256 mutex_init(&group->lock); in rvin_group_init()
259 group->count = 0; in rvin_group_init()
262 group->count++; in rvin_group_init()
264 vin_dbg(vin, "found %u enabled VIN's in DT", group->count); in rvin_group_init()
284 struct rvin_group *group = in rvin_group_release() local
291 rvin_group_cleanup(group); in rvin_group_release()
293 kfree(group); in rvin_group_release()
300 struct rvin_group *group; in rvin_group_get() local
321 group = rvin_group_data; in rvin_group_get()
322 kref_get(&group->refcount); in rvin_group_get()
324 group = kzalloc(sizeof(*group), GFP_KERNEL); in rvin_group_get()
325 if (!group) { in rvin_group_get()
330 ret = rvin_group_init(group, vin); in rvin_group_get()
332 kfree(group); in rvin_group_get()
337 kref_init(&group->refcount); in rvin_group_get()
339 rvin_group_data = group; in rvin_group_get()
344 mutex_lock(&group->lock); in rvin_group_get()
346 if (group->vin[id]) { in rvin_group_get()
348 mutex_unlock(&group->lock); in rvin_group_get()
349 kref_put(&group->refcount, rvin_group_release); in rvin_group_get()
353 group->vin[id] = vin; in rvin_group_get()
356 vin->group = group; in rvin_group_get()
357 vin->v4l2_dev.mdev = &group->mdev; in rvin_group_get()
359 mutex_unlock(&group->lock); in rvin_group_get()
369 struct rvin_group *group = vin->group; in rvin_group_put() local
371 mutex_lock(&group->lock); in rvin_group_put()
373 vin->group = NULL; in rvin_group_put()
376 if (WARN_ON(group->vin[vin->id] != vin)) in rvin_group_put()
379 group->vin[vin->id] = NULL; in rvin_group_put()
381 mutex_unlock(&group->lock); in rvin_group_put()
383 kref_put(&group->refcount, rvin_group_release); in rvin_group_put()
678 ret = media_device_register(&vin->group->mdev); in rvin_group_notify_complete()
690 if (vin->group->vin[i] && in rvin_group_notify_complete()
691 !video_is_registered(&vin->group->vin[i]->vdev)) { in rvin_group_notify_complete()
692 ret = rvin_v4l2_register(vin->group->vin[i]); in rvin_group_notify_complete()
699 mutex_lock(&vin->group->lock); in rvin_group_notify_complete()
706 if (!vin->group->vin[route->vin]) in rvin_group_notify_complete()
710 if (!vin->group->vin[rvin_group_id_to_master(route->vin)]) in rvin_group_notify_complete()
714 if (!vin->group->csi[route->csi].subdev) in rvin_group_notify_complete()
717 source = &vin->group->csi[route->csi].subdev->entity; in rvin_group_notify_complete()
721 sink = &vin->group->vin[route->vin]->vdev.entity; in rvin_group_notify_complete()
735 mutex_unlock(&vin->group->lock); in rvin_group_notify_complete()
748 if (vin->group->vin[i]) in rvin_group_notify_unbind()
749 rvin_v4l2_unregister(vin->group->vin[i]); in rvin_group_notify_unbind()
751 mutex_lock(&vin->group->lock); in rvin_group_notify_unbind()
754 if (vin->group->csi[i].fwnode != asd->match.fwnode) in rvin_group_notify_unbind()
756 vin->group->csi[i].subdev = NULL; in rvin_group_notify_unbind()
761 mutex_unlock(&vin->group->lock); in rvin_group_notify_unbind()
763 media_device_unregister(&vin->group->mdev); in rvin_group_notify_unbind()
773 mutex_lock(&vin->group->lock); in rvin_group_notify_bound()
776 if (vin->group->csi[i].fwnode != asd->match.fwnode) in rvin_group_notify_bound()
778 vin->group->csi[i].subdev = subdev; in rvin_group_notify_bound()
783 mutex_unlock(&vin->group->lock); in rvin_group_notify_bound()
810 mutex_lock(&vin->group->lock); in rvin_mc_parse_of_endpoint()
812 if (vin->group->csi[vep->base.id].fwnode) { in rvin_mc_parse_of_endpoint()
819 vin->group->csi[vep->base.id].fwnode = asd->match.fwnode; in rvin_mc_parse_of_endpoint()
824 mutex_unlock(&vin->group->lock); in rvin_mc_parse_of_endpoint()
835 mutex_lock(&vin->group->lock); in rvin_mc_parse_of_graph()
839 if (vin->group->vin[i]) { in rvin_mc_parse_of_graph()
845 if (vin->group->count != count) { in rvin_mc_parse_of_graph()
846 mutex_unlock(&vin->group->lock); in rvin_mc_parse_of_graph()
850 mutex_unlock(&vin->group->lock); in rvin_mc_parse_of_graph()
852 v4l2_async_notifier_init(&vin->group->notifier); in rvin_mc_parse_of_graph()
864 vin->group->vin[i]->dev, &vin->group->notifier, in rvin_mc_parse_of_graph()
871 if (list_empty(&vin->group->notifier.asd_list)) in rvin_mc_parse_of_graph()
874 vin->group->notifier.ops = &rvin_group_notify_ops; in rvin_mc_parse_of_graph()
876 &vin->group->notifier); in rvin_mc_parse_of_graph()
879 v4l2_async_notifier_cleanup(&vin->group->notifier); in rvin_mc_parse_of_graph()
1385 mutex_lock(&vin->group->lock); in rcar_vin_probe()
1386 if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) { in rcar_vin_probe()
1387 v4l2_async_notifier_unregister(&vin->group->notifier); in rcar_vin_probe()
1388 v4l2_async_notifier_cleanup(&vin->group->notifier); in rcar_vin_probe()
1390 mutex_unlock(&vin->group->lock); in rcar_vin_probe()
1412 v4l2_async_notifier_unregister(&vin->group->notifier); in rcar_vin_remove()
1413 v4l2_async_notifier_cleanup(&vin->group->notifier); in rcar_vin_remove()