/* * iss_pipeline_link_notify - Link management notification callback * @link: The link * @flags: New link flags that will be applied * * React to link management on powered pipelines by updating the use count of * all entities in the source and sink sides of the link. Entities are powered * on or off accordingly. * * Return 0 on success or a negative error code on failure. Powering entities * off is assumed to never fail. This function will not fail for disconnection * events. */ static int iss_pipeline_link_notify(struct media_link *link, u32 flags, unsigned int notification) { struct media_entity *source = link->source->entity; struct media_entity *sink = link->sink->entity; int source_use = iss_pipeline_pm_use_count(source); int sink_use = iss_pipeline_pm_use_count(sink); int ret; if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH && !(link->flags & MEDIA_LNK_FL_ENABLED)) { /* Powering off entities is assumed to never fail. */ iss_pipeline_pm_power(source, -sink_use); iss_pipeline_pm_power(sink, -source_use); return 0; } if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH && (flags & MEDIA_LNK_FL_ENABLED)) { ret = iss_pipeline_pm_power(source, sink_use); if (ret < 0) return ret; ret = iss_pipeline_pm_power(sink, source_use); if (ret < 0) iss_pipeline_pm_power(source, -sink_use); return ret; } return 0; }
/* * iss_pipeline_link_notify - Link management notification callback * @link: The link * @flags: New link flags that will be applied * * React to link management on powered pipelines by updating the use count of * all entities in the source and sink sides of the link. Entities are powered * on or off accordingly. * * Return 0 on success or a negative error code on failure. Powering entities * off is assumed to never fail. This function will not fail for disconnection * events. */ static int iss_pipeline_link_notify(struct media_link *link, u32 flags, unsigned int notification) { struct media_entity_graph *graph = &container_of(link->graph_obj.mdev, struct iss_device, media_dev)->pm_count_graph; struct media_entity *source = link->source->entity; struct media_entity *sink = link->sink->entity; int source_use; int sink_use; int ret; if (notification == MEDIA_DEV_NOTIFY_PRE_LINK_CH) { ret = media_entity_graph_walk_init(graph, link->graph_obj.mdev); if (ret) return ret; } source_use = iss_pipeline_pm_use_count(source, graph); sink_use = iss_pipeline_pm_use_count(sink, graph); if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH && !(flags & MEDIA_LNK_FL_ENABLED)) { /* Powering off entities is assumed to never fail. */ iss_pipeline_pm_power(source, -sink_use, graph); iss_pipeline_pm_power(sink, -source_use, graph); return 0; } if (notification == MEDIA_DEV_NOTIFY_PRE_LINK_CH && (flags & MEDIA_LNK_FL_ENABLED)) { ret = iss_pipeline_pm_power(source, sink_use, graph); if (ret < 0) return ret; ret = iss_pipeline_pm_power(sink, source_use, graph); if (ret < 0) iss_pipeline_pm_power(source, -sink_use, graph); } if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH) media_entity_graph_walk_cleanup(graph); return ret; }