Skip to content

Commit

Permalink
[media] media: Always keep a graph walk large enough around
Browse files Browse the repository at this point in the history
Re-create the graph walk object as needed in order to have one large enough
available for all entities in the graph.

This enumeration is used for pipeline power management in the future.

[mchehab@osg.samsung.com: fix documentation bug:
 " warning: bad line: graph_mutex"]

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  • Loading branch information
Sakari Ailus authored and Mauro Carvalho Chehab committed Mar 3, 2016
1 parent 4f27dba commit 0c426c4
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
21 changes: 21 additions & 0 deletions drivers/media/media-device.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,26 @@ int __must_check media_device_register_entity(struct media_device *mdev,

spin_unlock(&mdev->lock);

mutex_lock(&mdev->graph_mutex);
if (mdev->entity_internal_idx_max
>= mdev->pm_count_walk.ent_enum.idx_max) {
struct media_entity_graph new = { .top = 0 };

/*
* Initialise the new graph walk before cleaning up
* the old one in order not to spoil the graph walk
* object of the media device if graph walk init fails.
*/
ret = media_entity_graph_walk_init(&new, mdev);
if (ret) {
mutex_unlock(&mdev->graph_mutex);
return ret;
}
media_entity_graph_walk_cleanup(&mdev->pm_count_walk);
mdev->pm_count_walk = new;
}
mutex_unlock(&mdev->graph_mutex);

return 0;
}
EXPORT_SYMBOL_GPL(media_device_register_entity);
Expand Down Expand Up @@ -667,6 +687,7 @@ void media_device_cleanup(struct media_device *mdev)
{
ida_destroy(&mdev->entity_internal_idx);
mdev->entity_internal_idx_max = 0;
media_entity_graph_walk_cleanup(&mdev->pm_count_walk);
mutex_destroy(&mdev->graph_mutex);
}
EXPORT_SYMBOL_GPL(media_device_cleanup);
Expand Down
3 changes: 3 additions & 0 deletions include/media/media-device.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,8 @@ struct media_entity_notify {
* @entity_notify: List of registered entity_notify callbacks
* @lock: Entities list lock
* @graph_mutex: Entities graph operation lock
* @pm_count_walk: Graph walk for power state walk. Access serialised using
* graph_mutex.
*
* @source_priv: Driver Private data for enable/disable source handlers
* @enable_source: Enable Source Handler function pointer
Expand Down Expand Up @@ -373,6 +375,7 @@ struct media_device {
spinlock_t lock;
/* Serializes graph operations. */
struct mutex graph_mutex;
struct media_entity_graph pm_count_walk;

void *source_priv;
int (*enable_source)(struct media_entity *entity,
Expand Down

0 comments on commit 0c426c4

Please sign in to comment.