Lines Matching refs:entity

3  * Media entity
15 #include <media/media-entity.h>
99 "%s id %u: entity '%s'\n",
123 pad->entity->name, pad->index);
194 int media_entity_pads_init(struct media_entity *entity, u16 num_pads,
197 struct media_device *mdev = entity->graph_obj.mdev;
205 entity->num_pads = num_pads;
206 entity->pads = pads;
211 media_entity_for_each_pad(entity, iter) {
212 iter->entity = entity;
227 media_entity_for_each_pad(entity, iter)
245 * @entity: The entity
249 * This function checks the interdependency inside the entity between @pad0
255 * to check the dependency inside the entity between @pad0 and @pad1. If the
256 * has_pad_interdep operation is not implemented, all pads of the entity are
262 * The caller must hold entity->graph_obj.mdev->mutex.
266 static bool media_entity_has_pad_interdep(struct media_entity *entity,
269 if (pad0 >= entity->num_pads || pad1 >= entity->num_pads)
272 if (entity->pads[pad0].flags & entity->pads[pad1].flags &
276 if (!entity->ops || !entity->ops->has_pad_interdep)
279 return entity->ops->has_pad_interdep(entity, pad0, pad1);
283 media_entity_other(struct media_entity *entity, struct media_link *link)
285 if (link->source->entity == entity)
286 return link->sink->entity;
288 return link->source->entity;
291 /* push an entity to traversal stack */
293 struct media_entity *entity)
300 graph->stack[graph->top].link = entity->links.next;
301 graph->stack[graph->top].entity = entity;
306 struct media_entity *entity;
308 entity = graph->stack[graph->top].entity;
311 return entity;
315 #define stack_top(en) ((en)->stack[(en)->top].entity)
346 struct media_entity *entity)
349 media_entity_enum_set(&graph->ent_enum, entity);
352 graph->stack[graph->top].entity = NULL;
353 stack_push(graph, entity);
354 dev_dbg(entity->graph_obj.mdev->dev,
355 "begin graph walk at '%s'\n", entity->name);
361 struct media_entity *entity = stack_top(graph);
376 dev_dbg(entity->graph_obj.mdev->dev,
378 link->source->entity->name, link->source->index,
379 link->sink->entity->name, link->sink->index);
383 /* Get the entity at the other end of the link. */
384 next = media_entity_other(entity, link);
386 /* Has the entity already been visited? */
389 dev_dbg(entity->graph_obj.mdev->dev,
390 "walk: skipping entity '%s' (already seen)\n",
395 /* Push the new entity to stack and start over. */
398 dev_dbg(entity->graph_obj.mdev->dev, "walk: pushing '%s' on stack\n",
400 lockdep_assert_held(&entity->graph_obj.mdev->graph_mutex);
405 struct media_entity *entity;
411 * Depth first search. Push entity to stack and continue from
418 entity = stack_pop(graph);
419 dev_dbg(entity->graph_obj.mdev->dev,
420 "walk: returning entity '%s'\n", entity->name);
422 return entity;
434 * points to the incoming pad and the first link of the entity.
437 * internal pad dependencies in the entity, and then links in the graph. It
438 * does so by iterating over all links of the entity, and following enabled
527 entry->links = pad->entity->links.next;
531 walk->stack.top, pad->entity->name, pad->index);
550 if (entry->links->next == &entry->pad->entity->links) {
585 pad->entity->name, pad->index);
601 pad->entity->name, pad->index);
606 /* Explore the next link of the entity at the top of the stack. */
624 link->source->entity->name, link->source->index,
625 link->sink->entity->name, link->sink->index);
628 if (link->source->entity == origin->entity) {
638 * that is not connected internally in the entity to the incoming pad.
641 !media_entity_has_pad_interdep(origin->entity, origin->index,
669 * If we're done iterating over links, iterate over pads of the entity.
680 local->entity->name);
682 media_entity_for_each_pad(origin->entity, local) {
689 !media_entity_has_pad_interdep(origin->entity, origin->index,
750 ppad->pad->entity->name, ppad->pad->index);
807 struct media_entity *entity = pad->entity;
811 dev_dbg(mdev->dev, "Validating pad '%s':%u\n", pad->entity->name,
820 pad->entity->name, pad->index);
830 for_each_media_entity_data_link(entity, link) {
849 if (!entity->ops || !entity->ops->link_validate)
852 ret = entity->ops->link_validate(link);
856 link->source->entity->name,
858 link->sink->entity->name,
865 link->source->entity->name,
867 link->sink->entity->name,
879 pad->entity->name, pad->index);
1029 struct media_entity *entity)
1031 if (!entity)
1036 struct media_entity *entity;
1039 entity = ppad->pad->entity;
1042 if (!media_entity_enum_test_and_set(&iter->ent_enum, entity))
1043 return entity;
1067 static void __media_entity_remove_link(struct media_entity *entity,
1078 if (link->source->entity == entity)
1079 remote = link->sink->entity;
1081 remote = link->source->entity;
1087 if (link->source->entity == entity)
1105 int media_get_pad_index(struct media_entity *entity, u32 pad_type,
1110 if (!entity)
1113 for (i = 0; i < entity->num_pads; i++) {
1114 if ((entity->pads[i].flags &
1118 if (entity->pads[i].sig_type == sig_type)
1200 struct media_entity *entity;
1237 media_device_for_each_entity(entity, mdev) {
1238 if (entity->function != function)
1243 entity, sink_pad, flags);
1245 ret = media_create_pad_link(entity, source_pad,
1255 void __media_entity_remove_links(struct media_entity *entity)
1259 list_for_each_entry_safe(link, tmp, &entity->links, list)
1260 __media_entity_remove_link(entity, link);
1262 entity->num_links = 0;
1263 entity->num_backlinks = 0;
1267 void media_entity_remove_links(struct media_entity *entity)
1269 struct media_device *mdev = entity->graph_obj.mdev;
1271 /* Do nothing if the entity is not registered. */
1276 __media_entity_remove_links(entity);
1286 ret = media_entity_call(link->source->entity, link_setup,
1291 ret = media_entity_call(link->sink->entity, link_setup,
1294 media_entity_call(link->source->entity, link_setup,
1368 for_each_media_entity_data_link(source->entity, link) {
1369 if (link->source->entity == source->entity &&
1371 link->sink->entity == sink->entity &&
1384 for_each_media_entity_data_link(pad->entity, link) {
1401 media_entity_remote_pad_unique(const struct media_entity *entity,
1407 list_for_each_entry(link, &entity->links, list) {
1424 if (local_pad->entity == entity) {
1444 list_for_each_entry(link, &pad->entity->links, list) {
1470 int media_entity_get_fwnode_pad(struct media_entity *entity,
1478 if (!entity->ops || !entity->ops->get_fwnode_pad) {
1479 for (i = 0; i < entity->num_pads; i++) {
1480 if (entity->pads[i].flags & direction_flags)
1491 ret = entity->ops->get_fwnode_pad(entity, &endpoint);
1495 if (ret >= entity->num_pads)
1498 if (!(entity->pads[ret].flags & direction_flags))
1505 struct media_pipeline *media_entity_pipeline(struct media_entity *entity)
1509 media_entity_for_each_pad(entity, pad) {
1566 struct media_link *media_create_intf_link(struct media_entity *entity,
1577 link->entity = entity;
1656 struct media_link *__media_entity_next_link(struct media_entity *entity,
1661 : list_first_entry(&entity->links, typeof(*link), list);
1663 list_for_each_entry_from(link, &entity->links, list)