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] && 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()
699 ret = media_device_register(&vin->group->mdev); in rvin_group_notify_complete()
711 if (vin->group->vin[i] && in rvin_group_notify_complete()
712 !video_is_registered(&vin->group->vin[i]->vdev)) { in rvin_group_notify_complete()
713 ret = rvin_v4l2_register(vin->group->vin[i]); in rvin_group_notify_complete()
720 mutex_lock(&vin->group->lock); in rvin_group_notify_complete()
727 if (!vin->group->vin[route->vin]) in rvin_group_notify_complete()
731 if (!vin->group->vin[rvin_group_id_to_master(route->vin)]) in rvin_group_notify_complete()
735 if (!vin->group->csi[route->csi].subdev) in rvin_group_notify_complete()
738 source = &vin->group->csi[route->csi].subdev->entity; in rvin_group_notify_complete()
742 sink = &vin->group->vin[route->vin]->vdev.entity; in rvin_group_notify_complete()
756 mutex_unlock(&vin->group->lock); in rvin_group_notify_complete()
769 if (vin->group->vin[i]) in rvin_group_notify_unbind()
770 rvin_v4l2_unregister(vin->group->vin[i]); in rvin_group_notify_unbind()
772 mutex_lock(&vin->group->lock); in rvin_group_notify_unbind()
775 if (vin->group->csi[i].asd != asd) in rvin_group_notify_unbind()
777 vin->group->csi[i].subdev = NULL; in rvin_group_notify_unbind()
782 mutex_unlock(&vin->group->lock); in rvin_group_notify_unbind()
784 media_device_unregister(&vin->group->mdev); in rvin_group_notify_unbind()
794 mutex_lock(&vin->group->lock); in rvin_group_notify_bound()
797 if (vin->group->csi[i].asd != asd) in rvin_group_notify_bound()
799 vin->group->csi[i].subdev = subdev; in rvin_group_notify_bound()
804 mutex_unlock(&vin->group->lock); in rvin_group_notify_bound()
844 asd = v4l2_async_notifier_add_fwnode_subdev(&vin->group->notifier, in rvin_mc_parse_of()
852 vin->group->csi[vep.base.id].asd = asd; in rvin_mc_parse_of()
868 mutex_lock(&vin->group->lock); in rvin_mc_parse_of_graph()
872 if (vin->group->vin[i]) { in rvin_mc_parse_of_graph()
878 if (vin->group->count != count) { in rvin_mc_parse_of_graph()
879 mutex_unlock(&vin->group->lock); in rvin_mc_parse_of_graph()
883 mutex_unlock(&vin->group->lock); in rvin_mc_parse_of_graph()
885 v4l2_async_notifier_init(&vin->group->notifier); in rvin_mc_parse_of_graph()
897 if (vin->group->csi[id].asd) in rvin_mc_parse_of_graph()
900 ret = rvin_mc_parse_of(vin->group->vin[i], id); in rvin_mc_parse_of_graph()
906 if (list_empty(&vin->group->notifier.asd_list)) in rvin_mc_parse_of_graph()
909 vin->group->notifier.ops = &rvin_group_notify_ops; in rvin_mc_parse_of_graph()
911 &vin->group->notifier); in rvin_mc_parse_of_graph()
914 v4l2_async_notifier_cleanup(&vin->group->notifier); in rvin_mc_parse_of_graph()
990 struct rvin_dev *master = vin->group->vin[master_id]; in rvin_resume()
1456 mutex_lock(&vin->group->lock); in rcar_vin_probe()
1457 if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) { in rcar_vin_probe()
1458 v4l2_async_notifier_unregister(&vin->group->notifier); in rcar_vin_probe()
1459 v4l2_async_notifier_cleanup(&vin->group->notifier); in rcar_vin_probe()
1461 mutex_unlock(&vin->group->lock); in rcar_vin_probe()
1483 v4l2_async_notifier_unregister(&vin->group->notifier); in rcar_vin_remove()
1484 v4l2_async_notifier_cleanup(&vin->group->notifier); in rcar_vin_remove()